4

Rubyの for areject!とのreject違いとは? 簡単なコード スニペットでそれらの違いを説明できる人はいますか?delete_ifHash

4

3 に答える 3

13

他の回答はではArray#delete_ifなく を参照しているためHash#delete_if、これはあなたが求めているように思われるので、明確にする必要があると思いました。

他の人が指摘しているように、そのバージョンではハッシュがインプレースで変更され、新しいハッシュが作成さrejectれます。一方は とほぼ同じです。reject!reject!rejectdelete_ifreject!

実際、 の場合Arrayreject!delete_ifまったく同じです。

ただし、 の場合Hash、それらはわずかに異なります。reject!変更が行われなかった場合は返さnilれ、変更が行われた場合はハッシュが返されます。delete_if常にハッシュを返します。

hash = {a: 1, b: 2, c: 3}

return_value = hash.delete_if {|k, v| v > 100}
# hash is unchanged, return_value is {a: 1, b: 2, c: 3}

return_value = hash.reject! {|k, v| v > 100}
# hash is unchanged, return_value is nil

したがって、要素を削除した後にハッシュに変更が加えられたかどうかを確認したい場合はreject!、戻り値を使用して確認できます。

于 2013-01-13T20:58:10.260 に答える
2

ドキュメントからこれを読むことができると思います:

http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-reject-21 :

Array#delete_if と同等で、ブロックが true と評価された要素を自分自身から削除しますが、変更が行われていない場合は nil を返します。反復が終了した後ではなく、ブロックが呼び出されるたびに配列が即座に変更されます。Enumerable#reject と Array#delete_if も参照してください。ブロックが指定されていない場合は、代わりに列挙子が返されます。

http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-reject :

ブロックが真でない自分自身のアイテムを含む新しい配列を返します。Array#delete_if も参照してください。ブロックが指定されていない場合は、代わりに列挙子が返されます。

于 2013-01-13T20:06:19.340 に答える
2

ドキュメントを読むと、拒否されたことがわかります。は「Array#delete_if と同等」

拒否して拒否!強打 (reject!) を指定すると、操作している配列に直接変更が加えられるのに対し、reject を指定すると、操作している配列はそのまま残りますが、新しい配列が返されます。

a = [ "a", "b", "c" ]
b = a.reject {|x| x >= "b" }   #=> a is untouched, but b is ["a"]
a.reject! {|x| x >= "b" }   #=> a is now modified and is ["a"]
于 2013-01-13T20:09:37.060 に答える