有没有办法在Ruby上缩短这一行?
if (res = bla_permission_invalid).is_a? String then return res end
在
def something # many things that like this
if (res = bla_permission_invalid).is_a? String then return res end
# do something else
return true
end
当bla_permission_invalid的内容类似于
时def bla_permission_invalid
return invalid_address_report_func if invalid_address?
return permission_error_report_func if @user.not_one_of? [ :group1, :group2 ]
return nil
end
invalid_adress_report_func
和permission_error_report_func
返回字符串
答案 0 :(得分:5)
def something
bla_permission_invalid || (
# do something else
true)
end
答案 1 :(得分:4)
如果可能的值为String
和NilClass
,那么代码可以简化为:
def something
res = bla_permission_invalid()
return res if res # strings are truthy, so they'll be returned but nil will proceed
# do something else
true
end
答案 2 :(得分:2)
为了好玩,可以像这样重写你的something
方法:
def something
true.tap do
bla_permission_invalid.tap { |res| return res if res.is_a? String }
# do something else (thx Sergio)
end
end
但更重要的是,Mark Thomas对他的观察值得称赞,即手头的问题应该通过使用自定义例外来解决。
错误代码方法适用于没有异常的语言。 Ruby拥有它们。
答案 3 :(得分:1)
Mark Thomas在his comment中已经注意到,您似乎正在尝试使用某种字符串标识符来处理错误。您可以改为使用例外:
class AddressError < StandardError; end
class PermissionError < StandardError; end
def something
bla_permission_invalid
# do something
true
end
def bla_permission_invalid
raise AddressError if invalid_address?
raise PermissionError if @user.not_one_of? [ :group1, :group2 ]
end
在上面的代码something
调用bla_permission_invalid
中,执行其工作并返回true
。如果在bla_permission_invalid
中引发异常,它会自动向上传播调用堆栈,您不必从something
显式返回它。
处理异常:
begin
something
rescue AddressError
# handle address error
rescue PermissionError
# handle permission error
end