次のコードについて:
if a == 1
return "a is one"
end
IRB内で実行すると、
LocalJumpError: 予期しない
return
しかし、Rails アプリケーションに同じコードを入れると、問題なく動作します。
ブロック内から明示的な値を返さないようにする必要がありますか? Rails アプリケーションに問題がないのはなぜですか?
コンソールでこのコードを単独で実行すると、返されるスコープはありません。メソッド内に配置するとすぐに、期待どおりに機能します。
スコープなしの例:
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
覚えておくべき微妙な点があります。メソッドを介して作成されたブロックは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