Rubyは色々な状況でいろんな文を書くことができるので、リファレンスに載ってないような場合にどうなるのかよくわからないことがある…。たとえば制御構造。
def m1 yield end def m2(&block) block.call end def m3(proc) proc.call end m1 { return :block } # LocalJumpError: unexpected return m1(&(Proc.new { return :proc })) # LocalJumpError: unexpected return m1(&(lambda { return :lambda })) # LocalJumpError: unexpected return *1 m2 { return :block } # LocalJumpError: unexpected return m2(&(Proc.new { return :proc })) # LocalJumpError: unexpected return m2(&(lambda { return :lambda })) # => :lambda *2 m3(Proc.new { return :proc }) # LocalJumpError: unexpected return m3(lambda { return :lambda }) # => :lambda m1 { break :block } # => :block m1(&(Proc.new { break :proc })) # LocalJumpError: break from proc-closure *3 m1(&(lambda { break :lambda })) # LocalJumpError: break from proc-closure m2 { break :block } # => :block m2(&(Proc.new { break :proc })) # LocalJumpError: break from proc-closure m2(&(lambda { break :lambda })) # => :lambda *4 m3(Proc.new { break :proc }) # LocalJumpError: break from proc-closure m3(lambda { break :lambda }) # => :lambda
- *1 がダメで *2 がOKなのがよくわからない……
- *3 とか *4 は、Rubyリファレンスマニュアルの2007/10/14更新版 ではOKとされているっぽいけど、実際はダメみたい。
- next はどのパターンでもOKみたいなので、next使うのがいいのかな?