命名约定:为啥 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!
那样以感叹号结尾,因为delete
从self
中删除了一个元素?我错过了一些基本的东西吗?
【问题讨论】:
我的猜测是因为#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 末尾没有感叹号?的主要内容,如果未能解决你的问题,请参考以下文章