繁体   English   中英

“!”的目的是什么? 和 ”?” 在方法名称的末尾?

[英]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! 排序到位。
    • 在 Rails 中,如果保存失败, 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 中是什么意思?

bang 表示该方法作用于对象本身。 已经在这里回答:

为什么在 Ruby 方法中使用感叹号?

在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM