Ruby、戻り値を含む 1 行のガード句
概要
次のことを行う Ruby コードがあります
return [:error, "error message"] if guard_clause_fails?
書きたいことはこんな感じです
return (insert 2nd part of guard_clause_fails?) if guard_clause_fails?
def guard_clause_fails?
return [false, [:error, "error message"]]
end
これをルビで書くための読みやすい慣用的な方法はありますか?一行で
私はそれをできた
def guard_clause_fails?
@_return_code = [:error, "error message"]
false
end
return @_return_code if @guard_clause_fails?
次の開発者に @_return_code とは何なのか疑問に思わせるのではなく、より自己文書化されたコードが必要です。
解決策
メソッドが異なる型を返し、呼び出し側メソッドが応答からエラーが発生したか、応答が成功したメソッド呼び出しの結果であるかを推測する必要がある場合は、私は好きではありません。
代わりに、値オブジェクトを返すことを検討します。このモジュールを想像してください:
module ValueResponse
Response = Data.define(:success?, error: nil, value: nil)
def error(error)
Response.new(false, error:)
end
def success(value)
Response.new(true, value:)
end
end
そのモジュールを問題のクラスに含めて、次のように使用します。
include ValueResponse
def example_method
return error('message') if guard_clause_fails?
# ...
success(actual_return_value)
end
そうすれば、メソッドの呼び出し元にとって、メソッドの応答が実際に何を意味するかが明確になります。
response = example_method
if response.success?
response.value # read success response
else
response.error # handle error message
end