方法名称末尾的“!”和“?”的目的是什么?
有时我看到Ruby中的方法有“?” 和“!” 在他们的最后,例如:
name = "sample_string" name.reverse name.reverse! name.is_binary_data?
我想知道他们的目的是什么? 他们只是语法糖衣?
这是“只是糖衣”的可读性,但它们有共同的含义:
- 以
!
结尾的方法 执行一些永久或潜在的危险变化 ; 例如:-
Enumerable#sort
返回对象的sorting版本,而Enumerable#sort!
把它sorting。 - 在Rails中,如果保存失败,
ActiveRecord::Base#save
返回false,而ActiveRecord::Base#save!
引发了一个例外。 -
Kernel::exit
导致脚本退出,而Kernel::exit!
立即这样做,绕过任何退出处理程序。
-
- 以
?
结尾的方法 返回一个布尔值 ,这使得代码更加直观,就像一个句子 –if number.zero?
读起来像“如果数字是零”,但if number.zero
只是看起来很奇怪。
在你的例子中, name.reverse
计算结果是一个反转的string,但是只有在name.reverse!
行name
variables实际上包含反向名称。 name.is_binary_data?
看起来像“是name
二进制数据?”。
问号表示该方法返回布尔值。 已经在这里回答了:
Ruby中的问号运算符是什么意思?
爆炸表明该方法作用于对象本身。 已经在这里回答了:
为什么在Ruby方法中使用感叹号?
在Ruby中?
意味着该方法将返回一个布尔值和!
修改它被调用的对象。 在查看代码时,他们在那里提高可读性。
与 – 我想 – 大多数编程语言相反…
Ruby,方法允许以问号或感叹号结束。
按照惯例,回答问题的方法(即Array#empty?如果接收者为空则返回true)以问号标记结束。
按照惯例,潜在的“危险的”方法(即修改自我或参数,退出等等的方法)以惊叹号结尾。
来自: http : //www.ruby-lang.org/zh/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”并抛出。
相反,你必须在连接之前克隆它。 幸运的是我的testing套件抓住了这个,但是..抬头!