在ruby中,Array#delete(obj)
将搜索并从数组中移除指定的对象。然而,可能是我在这里错过了一些东西,但我发现返回值--- obj
本身---很奇怪,甚至有点无用。为什么delete会返回删除的元素而不是新的数组?
我个人认为,与sort/sort!
和map/map!
等方法一致,应该有两种方法, delete/delete!
,其中
ary.delete(obj) -> new array, with obj removed
ary.delete!(obj) -> ary (after removing obj from ary)
由于多种原因,首先在于目前delete
是不纯洁的,它应该发出警告说,就像在Array
许多其他方法的程序员(其实整个delete_???
家庭都有这个问题,他们是相当危险的方法!),第二个是返回obj
比返回新的数组要少得多,例如,如果delete
就像我描述的那样,那么我可以在一个语句中做多个删除,或者我可以删除后做点别的:
ary = [1,2,2,2,3,3,3,4]
ary.delete(2).delete(3) #=> [1,4], equivalent to "ary - [2,3]"
ary.delete(2).map{|x|x**2"} #=> [1,9,9,9,16]
这是优雅和易于阅读。
所以我想我的问题是:这是出于某种原因的故意设计,还是仅仅是语言的遗产?
相关:http://stackoverflow.com/a/26533811/1301972 – 2014-11-02 01:58:03
[Array#delelte_if](http://www.ruby-doc.org/core-2.1.1/Array.html#methodi-i -delete_if)可以做你想做的事:'a = [1,2,3]; a.delete_if {| e | e == 2} => [1,3]; a => [1,3]'或'[1,2,3] .delete_if {| e | e == 2} .map {| e | e ** 2} => [1,9]'。另一方面,'如果arr.delete(3)...'通常非常方便,并且比'sz = arr.size更好;如果sz-arr.delete.size> 0 ...'(即,如果delete返回结果数组)。我不认为你可以评估一个方法的规格与其他方法的独立性。 Ruby语言僧侣非常敏锐,通常他们的工作有很好的理由。 – 2014-11-02 03:35:02