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 に答える