Ruby 鲁比,拒绝!vs.delete_如果
作为Ruby的新手,我有一个关于.reject!在处理散列和数组时删除_if方法。如果只是想摆脱某些对象,那么这两种方法在功能上有什么区别吗?为什么要用一个来代替另一个 谢谢 编辑 我已经阅读了文档…我想我应该在我最初的问题中更加清楚。我想知道更多关于效率差异的信息。它们删除项目的方式是否不同?(同样,忽略返回值。我理解这是一个区别。谢谢!)对此非常清楚 区别在于如果Ruby 鲁比,拒绝!vs.delete_如果,ruby,arrays,syntax,hash,Ruby,Arrays,Syntax,Hash,作为Ruby的新手,我有一个关于.reject!在处理散列和数组时删除_if方法。如果只是想摆脱某些对象,那么这两种方法在功能上有什么区别吗?为什么要用一个来代替另一个 谢谢 编辑 我已经阅读了文档…我想我应该在我最初的问题中更加清楚。我想知道更多关于效率差异的信息。它们删除项目的方式是否不同?(同样,忽略返回值。我理解这是一个区别。谢谢!)对此非常清楚 区别在于如果拒绝不更改数组,它返回nil删除。 拒绝-创建不包含匹配元素的新数组并返回新数组 delete\u if-删除当前数组中匹配的元素
拒绝
不更改数组,它返回nil
<如果将返回未更改的数组,则代码>删除。
-创建不包含匹配元素的新数组并返回新数组拒绝
-删除当前数组中匹配的元素并返回数组delete\u if
拒绝代码>-从当前数组中删除匹配的元素。如果某个内容被拒绝,则返回数组;如果没有,则返回
nil
- tl;dr:
如果
看起来稍微快一点,请删除。然而,正如其他答案所指出的,选择方法的主要考虑因素是返回值的差异
既然你澄清了你的问题是关于效率的,我做了一些测试:
> time { (1..100000).to_a.reject!{ |n| n % 5 == 0 } }
0.390000 0.000000 0.390000 ( 0.394596)
> time { (1..100000).to_a.delete_if{ |n| n % 5 == 0 } }
0.400000 0.000000 0.400000 ( 0.399122)
> time { (1..200000).to_a.reject!{ |n| n % 5 == 0 } }
1.650000 0.000000 1.650000 ( 1.657927)
> time { (1..200000).to_a.delete_if{ |n| n % 5 == 0 } }
1.630000 0.010000 1.640000 ( 1.637719)
> time { (1..300000).to_a.reject!{ |n| n % 5 == 0 } }
3.700000 0.000000 3.700000 ( 3.717206)
> time { (1..300000).to_a.delete_if{ |n| n % 5 == 0 } }
3.660000 0.000000 3.660000 ( 3.686213)
> time { (1..400000).to_a.reject!{ |n| n % 5 == 0 } }
7.320000 0.020000 7.340000 ( 7.361767)
> time { (1..400000).to_a.delete_if{ |n| n % 5 == 0 } }
7.190000 0.020000 7.210000 ( 7.239549)
因此,如果稍微快一点,看起来超过一定大小的delete\u。
时间
定义为:
def time(&block)
puts Benchmark.measure(&block)
end
这些数字分别表示用户CPU时间、系统CPU时间、用户和系统CPU时间之和以及经过的实时时间。你可以找到它们含义的解释。
请注意,正如在每个基准测试中一样,YMMV和您应该在您的特定工作流上进行测试,而不是我人为的删除5的倍数的数字的示例。@rid如果您没有尝试阅读文档,那么delete_也是这样吗?关于这一点非常明确:@JanDvorak“……但是如果没有做任何更改,则返回nil。”看起来文档中包含了对我的返回值。哎呀,误读了。删除我的答案并更新你的答案。另外,在jRuby 1.7.3([“a”])中进行了测试。如果{false}
返回数组,则删除_,而[“a”]。拒绝!{false}
返回nil
)@ExplosionPills谢谢。我在文档中看到了这一点,但我想我在效率方面要求的更多。忽略返回值,我想知道删除项目是否更有效?我建议将作为指向文档的链接,而不是您链接的链接。对于散列,对于数组。@user1934428您可能误读了;我说如果拒绝代码>不更改数组。。。尝试a=[1,2,3,4];a、 拒绝!{| i | i==5}代码>谢谢你有条理的回答。比解析其他人内联编写的内容简单得多。reject
总是返回一个数组,而delete\u if
和reject代码>返回原始对象(例如,可能是一个集合)。对两个类似内置程序的效率的关注是一种误导。你没有通过这个测试证明什么。为什么这是一个“红鲱鱼”?OP“想知道更多关于效率差异的问题”,这是一个转移视线的问题,因为没有人应该根据执行速度的几分之一秒在这两种方法之间做出选择。我真的很不愿意看到那些将此作为其编码风格主要决定因素的人的代码。是的,但这并不重要,因为OP已经阅读了文档,并且完全意识到了语义上的差异。尽管如此,他/她还是特别问了效率问题,而不是什么时候使用什么的一般准则。我已经取消了我的反对票。我仍然觉得真正的答案是否定的,没有显著的差异,当然也没有与绩效相关的理由在两者之间做出选择。我向任何人提出挑战,让他们找到一个真实世界的例子,在这个例子中,它会产生真正的影响。