Rubyの for areject!
とのreject
違いとは? 簡単なコード スニペットでそれらの違いを説明できる人はいますか?delete_if
Hash
3 に答える
他の回答はではArray#delete_if
なく を参照しているためHash#delete_if
、これはあなたが求めているように思われるので、明確にする必要があると思いました。
他の人が指摘しているように、そのバージョンではハッシュがインプレースで変更され、新しいハッシュが作成さreject
れます。一方は とほぼ同じです。reject!
reject!
reject
delete_if
reject!
実際、 の場合Array
、reject!
と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!
、戻り値を使用して確認できます。
ドキュメントからこれを読むことができると思います:
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 も参照してください。ブロックが指定されていない場合は、代わりに列挙子が返されます。
ドキュメントを読むと、拒否されたことがわかります。は「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"]