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

有时我看到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!namevariables实际上包含反向名称。 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套件抓住了这个,但是..抬头!