ruby docsには、次のテキストがあります。
ブロックパラメータは実際にはローカル変数です。ブロックの実行時に同じ名前の既存のローカルが存在する場合、その変数はブロックの呼び出しによって変更されます。これは良いことかもしれませんし、そうでないかもしれません。
私はこれをテストするために以下のコードを書きました:
x = 0
3.upto(6) {|x| puts x}
puts x
# output are:
# 3
# 4
# 5
# 6
# 0
変数x
は変更されません。なんで?これはドキュメントに反します。