新手问题 这个方法怎么定义

tomnia · 2020年06月29日 · 最后由 tomnia 回复于 2020年06月29日 · 1983 次阅读

代码中有很多这样的结构:

def fun
  r = a_fun
  return r unless r == 0

  r = b_fun
  return r unless r == 0

  ...
  0
end

怎么把下面这一段写成一个可以公用的方法:

r = call_fun
return r unless r == 0

最后的代码可以写成:

def fun
  test(a_fun)
  test(b_fun)

  ...
  0
end

我知道有一种写法可简化一点:

def fun
  test = Proc.new { |a| return a unless a == 0 }
  test.call(a_fun)
  test.call(b_fun)

  ...
  0
end

但是整个项目里有很多地方会用到这段逻辑,我不想在每个用到的方法里定义下面这段,怎么才能在基类里(比如 ApplicationRecord)定义呢?

test = Proc.new { |a| return a unless a == 0 }

你需要的是子方法跳出到父方法的能力,考虑一下用catchthrow

def fun
  r = catch(:tag) do
    a_fun
    b_fun
    ...

    return 0
  end

  return r
end
piecehealth 回复

这种方式可以👍

需要 登录 后方可回复, 如果你还没有账号请 注册新账号