Ruby “的目的是什么?”&引用;“和”&引用;在方法名称的末尾?

Ruby “的目的是什么?”&引用;“和”&引用;在方法名称的末尾?,ruby,methods,syntax,predicate,syntactic-sugar,Ruby,Methods,Syntax,Predicate,Syntactic Sugar,有时我会看到Ruby中的方法末尾有“?”和“!”,例如: name = "sample_string" name.reverse name.reverse! name.is_binary_data? 我想知道他们的目的是什么?它们只是语法糖衣吗?问号表示该方法返回布尔值。这里已经回答了: 砰的一声表示该方法作用于对象本身。这里已经回答了: 这只是为了可读性的“糖衣”,但它们有共同的含义: 以结尾的方法执行一些永久性或潜在危险的更改;例如: Enumerable#sort返回对象的排序版本

有时我会看到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会立即执行此操作,绕过任何退出处理程序
  • 结尾的方法返回一个布尔值,这使得代码流更直观地像一个句子-
    if number.zero?
    读起来像“if number is zero”,但是
    if number.zero
    看起来很奇怪

在您的示例中,
name.reverse
计算结果为反向字符串,但仅在
name.reverse
名称
变量是否实际包含反向名称
name.is_binary\u data?
看起来像“is
name
binary data?”。

在Ruby中,
意味着该方法将返回布尔值和
修改调用它的对象。它们是为了在查看代码时提高可读性。

与大多数编程语言相比,我想

在Ruby中,方法允许以问号或感叹号结尾

按照惯例,回答问题的方法(即,如果接收方为空,则数组#empty?返回true)以问号结尾

按照约定,潜在的“危险”方法(即修改self或参数、exit!等的方法)以感叹号结尾


From:,Section-fully-method-names

注意,情况并非总是这样。以Ruby数组#concat为例

您可能会被严重烧伤的地方有
MyActiveRecordModel.column\u names.concat([url])
。稍后与MyActiveRecordModel相关的调用将尝试查找MyActiveRecordModel的“url”列并抛出


相反,您必须在执行concat之前克隆它。幸运的是,我的测试套件捕捉到了这个,但是。。小心

另外,以
结尾的方法也被称为谓词方法。一个重要的注意事项是,如果您还具有相应的非bang方法,则应该只有bang方法。爆炸被用来区分“更令人惊讶”的方法和“不那么令人惊讶”的方法。如果只有一种方法,那么就不需要区分,也不应该用“砰”的一声来命名。例如,请参见
Array#clear
。它清除数组。清除数组自然会使其发生变异。这没什么奇怪的,名字已经很清楚了,因此:没有爆炸。参见。根据@JörgWMittag所述,添加到:如果存在危险方法的安全版本,则潜在危险方法(即修改self或参数的方法,exit!(不像exit那样运行终结器)的名称应以感叹号结尾。注意,情况并非总是如此。例如,Ruby数组#concat。您可能会严重烧伤的地方类似于MyActiveRecordModel.column\u names.concat(…)。相反,您必须先克隆它,然后再执行concat。的可能副本