ruby - 为什么 delete 返回的是被删除的元素而不是新数组?

标签 ruby

在 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 可能危险也可能不危险;这就是为什么他们有带和不带爆炸的版本。

至于它为什么返回提取的元素,它提供了对信息的访问,如果它不是这样设计的,那么引用起来很麻烦。修改后的原始数组可以很容易地通过访问接收者来引用,但是提取的元素不容易访问。

也许,您可能会将其与添加元素的方法进行比较,例如 pushunshift。这些方法添加元素而不考虑接收方数组有哪些元素,因此返回添加的元素将始终与传递的参数相同,你知道这一点,因此返回添加的元素没有帮助。所以返回修改后的数组,这样更有帮助。对于delete,元素是否被提取取决于接收数组是否有它,而你并不知道,所以将它作为返回值是有用的。

关于ruby - 为什么 delete 返回的是被删除的元素而不是新数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695015/

相关文章:

ruby-on-rails - 在任何源中都找不到 json-1.8.1

ruby - 如何从包含空格的字符串创建符号?

ruby - *nix 是什么意思?

ruby-on-rails - 无法在 Rails 3 中渲染表单?帮助?

Ruby - 返回包含 Bignum/Fixnum 的二进制补码表示的字节数组

ruby-on-rails - 如何避免未定义方法错误

ruby-on-rails - 脚本/服务器 custom_require.rb :36:in `require' : cannot load such file -- test/unit/error (LoadError)

ruby - 使用 Mongoid 查找集合中的所有文档

ruby - 计算句子 Ruby 的数量

ruby-on-rails - 从特定变量生成唯一 token