ほとんどの人は_、最後の戻り値のホルダーとしてのIRBでの特別な意味を認識していますが、それは私がここで求めていることではありません。
代わりに、_plain-old-Ruby-codeで変数名として使用される場合について質問しています。ここでは、「ドントケア変数」(àlaProlog)に似た特別な動作があるように見えます。以下に、その固有の動作を示すいくつかの便利な例を示します。
lambda { |x, x| 42 } # SyntaxError: duplicated argument name
lambda { |_, _| 42 }.call(4, 2) # => 42
lambda { |_, _| 42 }.call(_, _) # NameError: undefined local variable or method `_'
lambda { |_| _ + 1 }.call(42) # => 43
lambda { |_, _| _ }.call(4, 2) # 1.8.7: => 2
# 1.9.3: => 4
_ = 42
_ * 100 # => 4200
_, _ = 4, 2; _ # => 2
これらはすべてputs、追加機能との競合を避けるために、IRBではなくRubyで直接(sが追加されて)実行されました。
ただし、これはすべて私自身の実験の結果です。この動作に関するドキュメントはどこにも見つからないためです(確かに、検索するのが最も簡単な方法ではありません)。最終的に、これらすべてが内部でどのように機能するのか興味があり、何が特別なのかを正確に理解することができます_。そのため、ドキュメントへの参照、できれば、Rubyでの動作を明らかにするRubyソースコード(およびおそらくRubySpec)への参照を求めています_。
注:これのほとんどは、@ NiklasBとのこの話し合いから生じました。
lambda { |_, _| _ }.call(4, 2)1.8と1.9の動作の違いは、意図しない副作用にすぎないのでしょうか。変数名を複製できない「通常の」状況では、割り当てられた順序は重要ではありません。