命名约定:为啥 Array#delete 末尾没有感叹号?

Posted

技术标签:

【中文标题】命名约定:为啥 Array#delete 末尾没有感叹号?【英文标题】:Naming convention: Why Array#delete has no exclamation mark at the end?命名约定:为什么 Array#delete 末尾没有感叹号? 【发布时间】:2012-03-18 08:32:37 【问题描述】:

我正在学习 Ruby,并且我看到按照惯例,方法名称末尾的感叹号意味着该方法以某种方式修改了 self。为什么Array#delete 不像slice! 那样以感叹号结尾,因为deleteself 中删除了一个元素?我错过了一些基本的东西吗?

【问题讨论】:

我的猜测是因为#delete 只能删除,所以不需要标记它。 #upper_case 之类的东西既可以分配给新创建的对象,也可以在确定使用时覆盖原始对象。 是的,但是没有标志的#delete 也可以返回一个减去指定元素的克隆(这是我在没有标志的情况下所期望的):) Why are exclamation marks used in Ruby methods? 的可能重复项 【参考方案1】:

引用Matz(Ruby 的总工程师):

砰(!)并不意味着“破坏性”,也不是没有它意味着非 破坏性的。 bang 标志的意思是“bang 版本更 比它的非爆炸对应物危险;小心处理”。

由于Array#delete 没有危险性较低的对应物,因此不需要感叹号。

【讨论】:

【参考方案2】:

“bang”方法并不意味着它会修改接收器。它表明一种方法是现有方法的更危险版本。请参阅David A. Black's description 的区别,以及 response to a request 更改 Ruby 2.0。

这是一个很常见的误解。注意投票率很高的错误答案here。

【讨论】:

以上是关于命名约定:为啥 Array#delete 末尾没有感叹号?的主要内容,如果未能解决你的问题,请参考以下文章

RESTFUL API 中“操作”的命名约定

为啥我们有 lower_case_with_underscores 命名约定? [关闭]

MySQL数据库命名规范及约定

MySQL数据库命名规范及约定

为啥 Scala 在类名的末尾放置一个美元符号?

为啥 Scala 在类名的末尾放置一个美元符号?