[英]What is the purpose of “!” and “?” at the end of method names?
有时我会看到 Ruby 中的方法带有“?” 和 ”!” 在他们的最后,例如:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
我想知道他们的目的是什么? 它们只是语法糖衣吗?
为了可读性,它“只是糖衣”,但它们确实具有共同的含义:
!
执行一些永久性或潜在危险的更改; 例如:
Enumerable#sort
返回对象的排序版本,而Enumerable#sort!
排序到位。ActiveRecord::Base#save
返回 false,而ActiveRecord::Base#save!
引发异常。Kernel::exit
导致脚本退出,而Kernel::exit!
立即执行,绕过任何退出处理程序。?
结尾的方法返回一个 boolean ,这使得代码流更直观,就像一个句子if number.zero?
读起来像“如果数字为零”,但if number.zero
看起来很奇怪。 在您的示例中, name.reverse
评估为反转字符串,但仅在name.reverse!
行name
变量实际上包含反向名称。 name.is_binary_data?
看起来像“ name
是二进制数据吗?”。
在 Ruby 中?
意味着该方法将返回一个布尔值和!
修改它被调用的对象。 在查看代码时,它们可以提高可读性。
与 - 我想 - 大多数编程语言相比......
Ruby,允许方法以问号或感叹号结尾。
按照惯例,回答问题的方法(即 Array#empty? 如果接收者为空则返回 true)以问号结尾。
按照惯例,潜在的“危险”方法(即修改 self 或参数的方法,退出!等)以感叹号结尾。
来自: http : //www.ruby-lang.org/en/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”列并抛出。
相反,您必须在执行 concat 之前克隆它。 幸运的是我的测试套件抓住了这个,但是.. 注意!
其他答案很好地涵盖了返回值。 我将添加现代样式指南,不建议将is_
前缀用于布尔方法。 末尾的问号涵盖了语义语义。
从https://github.com/rubocop-hq/ruby-style-guide :
布尔方法问号
谓词方法的名称(返回布尔值的方法)应以问号结尾(即Array#empty?)。 不返回布尔值的方法不应以问号结尾。
布尔方法前缀
避免在谓词方法前加上辅助动词,例如is,do或can。 这些单词是多余的,并且与Ruby核心库中的boolean方法的风格不一致,例如为空? 并包括?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.