Ruby,带返回值的一行保护子句

问题描述 投票:0回答: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

有没有一种很好的可读的惯用方式来用 ruby 编写这个? 一行

我可以做

def guard_clause_fails?
  @_return_code = [:error, "error message"]
  false
end

return @_return_code if @guard_clause_fails?

我想要更多的自记录代码,而不是让下一个开发人员想知道 @_return_code 是什么。

ruby
1个回答
0
投票

我不喜欢方法返回不同的类型,并且调用方法需要通过响应来猜测是否发生错误或者响应是否是成功方法调用的结果。

相反,我会考虑返回一个值对象。想象一下这个模块:

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
© www.soinside.com 2019 - 2024. All rights reserved.