1 つのチュートリアルには、次のコード ブロックがあります。
h1 = ["a" => 111, "b" => 222]
h2 = ["b" => 333, "c" => 444]
h1.merge(h2) {|key, old, new| new}
# => ["a" => 111, "b" => 333, "c" => 444]
h1.merge(h2) {|key, old, new| old}
# => ["a" => 111, "b" => 222, "c" => 444]
マージと競合しています。2 つの配列にまたがる 2 つの重複キー。はの の値をnew
キャプチャしており、それを出力するとマージで優先されます。同様に、はの の値をキャプチャし、強制的に優先させます。h2
"b"
old
h1
"b"
の値しか取得していないように見えるのはなぜ"b"
ですか? 変数が配列全体を取得するべきではありませんか? ブロック変数は.merge
、たとえば とは対照的に、 と一緒に使用すると、状況に依存し、機能を変更し.times
ますか? それとも、単純な数値の代わりに配列を扱っているときに機能が変わるのでしょうか? それとも、マージの競合を見て、「競合のポイントを把握しなければならない」ようになっているのでしょうか? 何が入っているか見てみようかなと思ったのですがkey
、
h1.merge(h2) {|key, old, new| key}
# => ["a" => 111, "b" => "b", "c" => 444]
しかし、それは実際には私をもっと混乱させました。1 つの変数がキーをキャプチャしているのに、他の変数が 2 つの異なる値をキャプチャしているのはなぜですか?