"Hash#reject!"和"Hash#reject"与"Hash#delete_if"有何不同?

Aru*_*hit 4 ruby

如何reject!与reject从不同delete_if的HashRuby的?任何人都可以用简单的代码片段解释它们之间的差异吗?

And*_*nes 13

由于其他答案是指的,Array#delete_if而不是Hash#delete_if,这似乎是你所要求的,我想我应该澄清.

正如其他人所指出的那样,reject并且reject!在不同的reject!版本修改就地散,同时reject创建一个新的哈希值.同时delete_if是几乎一样的reject!.

其实,对于一个Array,reject!并且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
Run Code Online (Sandbox Code Playgroud)

因此,如果要在删除元素后检查是否对哈希进行了更改,则可以使用reject!并检查返回值.