Ruby一行if return语句

时间:2013-10-25 10:03:55

标签: ruby refactoring return

有没有办法在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 个答案:

答案 0 :(得分:5)

def something
  bla_permission_invalid || (
  # do something else
  true)
end

答案 1 :(得分:4)

如果可能的值为StringNilClass,那么代码可以简化为:

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