2017-08-22 8 views
1

私は.tapコンテキスト内の配列を変更した場合、修正されたバージョンが返されます。Rubyでpipe equalがtapで機能しないのはなぜですか?

states = [:a, :b].tap do |sts| 
    sts << :c 
end 

puts states # [:a, :b, :c] 

しかし、私は|=でそれを変更した場合、それは同じオブジェクトを返します。

states = [:a, :b].tap do |sts| 
    [[:a, :c], [:b, :d]].each do |type| 
    sts |= type 
    end 

    puts sts.inspect # [:a, :b, :c, :d] 
end 

puts states.inspect # [:a, :b] 

は私を指してもらえ正しい方向は?

答えて

2

なぜですか?

オリジナルは変更しないため、stsです。代わりに新しい配列|=演算子から)を作成し、stsをその新しい配列を指すようにします。もちろん、tapブロックが返されると、この一時配列は永遠に失われます。あなたが知らなかった場合には


sts |= type 

は、ドキュメントから

sts = sts | type 
1

ためのショートカットです:

タップ{| X |ブロック}→obj

ブロックに自己を返し、自己を返します。このメソッドの主な目的は、チェーン内の中間結果に対して操作を実行するために、メソッドチェーンを「タップイン」することです。

最初に、渡された配列を変更して変更しました。

a = [1, 2] # => [1, 2] 
b = a 
b |= [3] 
a # => [1, 2] 
b # => [1, 2, 3] 
+0

は、なぜ私はどう思いますか、「ノイズ」:

は、第二のケースで、あなただけの新しい配列を作成しますか?それが何かを実証するのを助ける方法、私は正直に不思議ですか? [これをフォーマットする方法](https://pastebin.com/raw/xU8hcx7J)などです。クリーナー__and__ copy-pastable。 –

+0

大丈夫ですので、フォーマットについて話しています、私はあなたの点を受け入れる –

+0

ええ、私は明確でない場合は申し訳ありません。明らかに、私は_code_について話していませんでした。ちょうどノイズ:) –

関連する問題