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

artone · 发布于 2016年08月01日 · 最后由 artone 回复于 2016年08月03日 · 1238 次阅读
3417

我写了一个 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 提早返回,减少嵌套的发生,请问我还可以怎么写呢?

谢谢!

共收到 8 条回复
121

next 来取代 return

5984

proc是可以return的。

2456

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

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

5楼 已删除
25127

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

314

可以使用 exit

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

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

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