Answers:
出于可读性考虑,它只是“糖衣”,但它们确实具有共同的含义:
!
进行某些永久或潜在的危险改变 ; 例如:
Enumerable#sort
返回对象的排序版本,同时将其排序Enumerable#sort!
。ActiveRecord::Base#save
如果保存失败,则返回false,而ActiveRecord::Base#save!
引发异常。Kernel::exit
导致脚本退出,而Kernel::exit!
立即退出,绕过所有退出处理程序。?
以boolean 结尾的方法返回一个boolean值,这使代码流更直观地像一个句子— if number.zero?
读起来就像“如果数字为零”,但if number.zero
看起来很奇怪。在您的示例中,name.reverse
计算结果为反向字符串,但仅在该name.reverse!
行之后,name
变量才实际包含反向名称。name.is_binary_data?
看起来像“是name
二进制数据吗?”。
Array#clear
例如,参见。清除数组。清除数组自然会使它变异。对此没有什么奇怪的,因此名称已经很清楚了:因此,请放心。参见ruby-forum.com/topic/176830#773946。
与我所认为的大多数编程语言相反...
Ruby,方法以问号或感叹号结尾。
按照约定,回答问题的方法(即Array#empty?如果接收者为空,则返回true)以问号结尾。
按照惯例,潜在的“危险”方法(即,修改自我或自变量,退出!等的方法)以感叹号结尾。
来自:http : //www.ruby-lang.org/zh-CN/documentation/ruby-from-other-languages/,部分有趣的方法名称
?
也称为谓词方法。
当心,并非总是如此。以Ruby Array#concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat为例。
在那里你可能被严重烧伤MyActiveRecordModel.column_names.concat([url])
。以后与MyActiveRecordModel相关的调用将尝试为MyActiveRecordModel查找“ url”列并抛出异常。
相反,您必须先克隆它,然后再进行连接。幸运的是我的测试套件抓住了这个,但是..