Ruby のブロック内でスコープの外と同じ名前の変数を上書きせずに定義する

例えば、次のようにブロックスコープ内でスコープの外にある名前の変数を使った場合、変数の中身は上書きされてしまいます。

value = "homu"
twice = Proc.new { |it|
    value = it
    value + value
}
twice.call 10
# => 20
value
# => 10

まぁこれは当然ですね。
しかし、意図しないでうっかり同じ変数名を使ってしまう事があるかも知れません。
そういう場合、次のようにしてパラメータリストで変数を宣言しておくと、こういう意図しない副作用を回避する事ができます。

value = "homu"

# パラメータリストで変数を宣言
twice = Proc.new { |it;value|
    value = it
    value + value
}
twice.call 10
# => 20
value
# => "homu"

これでスコープの外の変数を上書きせずにブロック内で同名の変数を使うことができます。

[参照]

http://se-bikou.blogspot.jp/2011/04/ruby.html