4

reject!与Ruby中的 a有何reject不同?谁能用简单的代码片段解释它们之间的区别?delete_ifHash

4

3 回答 3

13

由于其他答案是指Array#delete_if而不是Hash#delete_if,这似乎是您要问的,我想我应该澄清一下。

正如其他人指出的那样,reject不同reject!之处在于该reject!版本会就地修改哈希,同时reject创建一个新的哈希。同时delete_if几乎是一样reject!

事实上,对于一个Arrayreject!delete_if完全一样的。

但是,对于 a 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,从 self 中删除块评估为 true 的元素,但如果没有进行任何更改,则返回 nil。每次调用块时数组都会立即更改,而不是在迭代结束后更改。另请参见 Enumerable#reject 和 Array#delete_if。如果没有给出块,则返回一个枚举器。

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

返回一个新数组,其中包含 self 中块不正确的项。另见 Array#delete_if 如果没有给出块,则返回一个枚举器。

于 2013-01-13T20:06:19.340 回答
2

如果您阅读文档,它会告诉您拒绝!是“等效于 Array#delete_if”

拒绝和拒绝!不同之处在于 bang (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 回答