Techioz Blog

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