goo blog サービス終了のお知らせ 

13F

備忘録

Rubyの制御構造

2007-11-26 21:11:27 | Ruby
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使うのがいいのかな?