首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`Hash#reject!`和`Hash#reject`与`Hash#delete_if`有什么不同?

`Hash#reject!`和`Hash#reject`与`Hash#delete_if`有什么不同?
EN

Stack Overflow用户
提问于 2013-01-14 04:02:15
回答 3查看 1.6K关注 0票数 4

对于Ruby语言中的Hashreject!rejectdelete_if有什么不同?有人能用简单的代码片段来解释它们之间的区别吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-14 04:58:10

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

正如其他人所指出的,rejectreject!的不同之处在于,reject!版本就地修改散列,而reject创建新的散列。同时,delete_ifreject!几乎相同。

事实上,对于Arrayreject!delete_if是完全相同的。

然而,对于Hash来说,它们略有不同。如果未进行任何更改,则reject!返回nil;如果进行了更改,则返回散列。delete_if始终返回散列。

代码语言:javascript
复制
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!并检查返回值。

票数 13
EN

Stack Overflow用户

发布于 2013-01-14 04:06:19

我想你可以从文档中读到这个:

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如果未给定块,则返回枚举数。

票数 2
EN

Stack Overflow用户

发布于 2013-01-14 04:09:37

如果你读了文档,它会告诉你拒绝!是“等同于Array#delete_if”

拒绝,拒绝!不同之处在于bang (拒绝!)使更改直接发生在您正在处理的数组上,而reject将使您正在处理的数组保持不变,但将返回一个新的数组。

代码语言:javascript
复制
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"]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14307573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档