8

有没有办法在 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_funcpermission_error_report_func返回字符串

4

4 回答 4

7

如果可能的值为Stringand 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
于 2013-10-25T11:25:57.813 回答
5
def something
  bla_permission_invalid || (
  # do something else
  true)
end
于 2013-10-25T11:19:04.740 回答
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 的观察值得称赞,他认为手头的问题应该通过使用自定义异常来解决。

错误代码方法适用于没有异常的语言。鲁比有他们。

于 2013-10-25T11:31:28.660 回答
1

Mark Thomas 在他的评论中已经指出,您似乎正在尝试使用某种字符串标识符自行处理错误。您可以改用异常:

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
于 2013-10-25T12:12:43.050 回答