2

关于以下代码:

if a == 1
  return "a is one"
end

当我在 IRB 中执行它时,它给了我

LocalJumpError:意外return

但是,当我将相同的代码放入我的 Rails 应用程序时,它可以完美运行。

我真的必须避免从块内部返回显式值吗?为什么 Rails 应用程序没有问题?

4

2 回答 2

5

当您在控制台中自行运行此代码时,没有可返回的范围。一旦将其放入方法中,它将按预期工作。

没有范围的例子:

irb(main):001:0> if a = 1
irb(main):002:1>   return "a is one"
irb(main):003:1> end
LocalJumpError: unexpected return
  from (irb):2
  from /Users/dougal/.rbenv/versions/1.9.3-p194/bin/irb:12:in `<main>'

方法范围内的示例:

irb(main):001:0> def run
irb(main):002:1> if a = 1
irb(main):003:2>   return "a is one"
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> puts run
a is one
=> nil
于 2012-11-11T20:24:12.590 回答
2

需要记住一个微妙之处:通过lambda行为类似方法创建的块 - 它们的内部return只是终止块本身,但通用块return终止相应的方法

def generic_block_demo
  (10..15).each {|el| return el }
  puts "You'll never be here"
end

def lambda_block_demo
  (10..15).each &lambda{|el| return el }
  puts "You'll be here! I know!"
  12345
end

puts generic_block_demo # => 10

puts lambda_block_demo # => You'll be here! I know!
                       #    12345
于 2012-11-11T20:50:30.600 回答