我有执行以下操作的 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 是什么。
我不喜欢方法返回不同的类型,并且调用方法需要通过响应来猜测是否发生错误或者响应是否是成功方法调用的结果。
相反,我会考虑返回一个值对象。想象一下这个模块:
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