Ruby 如何在 block 区块内提早返回?

artone · 2016年08月01日 · 最后由 artone 回复于 2016年08月03日 · 2468 次阅读

我写了一个 rake task,以下程式码是精简过的,这是会出现 Unexpected Return (LocalJumpError) 错误的,似乎是因为 block 里面不能用 return 的缘故:

namespace :reminder do
  desc "reminder todo"
  task todo: :environment do

    wday = Time.zone.now.wday
    return if wday == 6

    # do something...
  end
end

我可以把它包在 unlessif 条件式里面来解决这个问题:

unless wday == 6
  # do something
end

可能是我写 Javascript 的习惯,我不喜欢用 if 这样层层嵌套,尤其是如果我这里条件更复杂的时候,想要提早用 return 提早返回,减少嵌套的发生,请问我还可以怎么写呢?

谢谢!

next 来取代 return

proc 是可以 return 的。

Rake Task 里面使用 return 会有问题,可以使用 next/abort/fail/raise 代替。

不过最好的做法是把主要逻辑放在其它类里面,Rake Task 仅调用,详细说明

5 楼 已删除

proc 对象中 return 会直接从定义该 proc 的上下文中 return,如果该 proc 对象没有定义在一个方法里就相当于你在一个对象中直接 return 了,所以会报错。

可以使用 exit

catch(:return_from_here) do
  # ...
  throw(:return_from_here) if not_happy
  #...
end

#4 楼 @zlx_star 非常详细的说明 👍

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