在 ruby 中,Array#delete(obj)
将从数组中搜索并删除指定的对象。然而,可能是我在这里遗漏了一些东西,但我发现返回值 --- obj
本身 --- 很奇怪,甚至有点无用。
我的愚见是,与 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]
优雅且易于阅读。
所以我想我的问题是:这是出于某种原因的故意设计,还是仅仅是语言的继承?
最佳答案
如果您已经知道 delete
总是危险的,则无需添加爆炸 !
来进一步注意它是危险的。这就是为什么它没有它。其他方法如 map
可能危险也可能不危险;这就是为什么他们有带和不带爆炸的版本。
至于它为什么返回提取的元素,它提供了对信息的访问,如果它不是这样设计的,那么引用起来很麻烦。修改后的原始数组可以很容易地通过访问接收者来引用,但是提取的元素不容易访问。
也许,您可能会将其与添加元素的方法进行比较,例如 push
或 unshift
。这些方法添加元素而不考虑接收方数组有哪些元素,因此返回添加的元素将始终与传递的参数相同,你知道这一点,因此返回添加的元素没有帮助。所以返回修改后的数组,这样更有帮助。对于delete
,元素是否被提取取决于接收数组是否有它,而你并不知道,所以将它作为返回值是有用的。
关于ruby - 为什么 delete 返回的是被删除的元素而不是新数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695015/