Ruby にはブロックスコープがない

ので、それこそブロックをつかってブロックスコープみたいなのを作ってみる。

module Kernel
  def b
    yield
  end
end

x = 1
b {|x|
  x = 2
  b {|x|
    x = 3
    puts x  #=>3
  }
  puts x    #=>2
}
puts x      #=>1

もちろん、括弧の代わりに do ~ end でもできます。
ただし、変数をいちいち |○|としないとスコープにならない。メソッド名の b も邪魔。

しかし、ブロックスコープがなくても不便だと思ったことがないなあ。