在Ruby中,有些方法带有问号(?),会问include?询问是否包含有问题的对象,然后返回true/false。
但是为什么有些方法有感叹号(!)而其他方法没有呢?
这是什么意思?
在Ruby中,有些方法带有问号(?),会问include?询问是否包含有问题的对象,然后返回true/false。
但是为什么有些方法有感叹号(!)而其他方法没有呢?
这是什么意思?
当前回答
感叹号意味着很多事情,有时你除了“这很危险,小心”外,你无法从它身上看出很多东西。
正如其他人所说,在标准方法中,它通常用于指示导致对象自身变异的方法,但并不总是如此。请注意,许多标准方法更改了它们的接收器,并且没有感叹号(pop、shift、clear),并且一些带有感叹号的方法不更改它们的接收器(exit!)。例如,请参阅这篇文章。
其他库可能以不同的方式使用它。在Rails中,感叹号通常意味着该方法将在失败时抛出异常,而不是无声地失败。
这是一种命名惯例,但许多人以微妙的不同方式使用它。在你自己的代码中,一个好的经验法则是当一个方法做了一些“危险”的事情时使用它,特别是当存在两个同名的方法,其中一个比另一个更“危险”时。“危险”几乎可以指任何事情。
其他回答
感叹号意味着很多事情,有时你除了“这很危险,小心”外,你无法从它身上看出很多东西。
正如其他人所说,在标准方法中,它通常用于指示导致对象自身变异的方法,但并不总是如此。请注意,许多标准方法更改了它们的接收器,并且没有感叹号(pop、shift、clear),并且一些带有感叹号的方法不更改它们的接收器(exit!)。例如,请参阅这篇文章。
其他库可能以不同的方式使用它。在Rails中,感叹号通常意味着该方法将在失败时抛出异常,而不是无声地失败。
这是一种命名惯例,但许多人以微妙的不同方式使用它。在你自己的代码中,一个好的经验法则是当一个方法做了一些“危险”的事情时使用它,特别是当存在两个同名的方法,其中一个比另一个更“危险”时。“危险”几乎可以指任何事情。
简单的解释:
foo = "BEST DAY EVER" #assign a string to variable foo.
=> foo.downcase #call method downcase, this is without any exclamation.
"best day ever" #returns the result in downcase, but no change in value of foo.
=> foo #call the variable foo now.
"BEST DAY EVER" #variable is unchanged.
=> foo.downcase! #call destructive version.
=> foo #call the variable foo now.
"best day ever" #variable has been mutated in place.
但是如果你曾经用downcase来调用一个方法!在上面的解释中,foo将永久地更改为downcase。downcase !不会返回一个新的字符串对象,而是在适当的位置替换字符串,完全将foo更改为downcase。 我建议你不要用小写!除非完全有必要。
这个命名约定来自Scheme。
1.3.5命名约定 按照惯例,程序的名称 总是返回一个布尔值 通常以“?”结尾。这样的程序 称为谓词。 按照惯例,程序的名称 存储值到先前 已分配的位置(见3.4节) 通常以“!”结尾。这样的程序 叫做变异程序。通过 方法返回的值 突变过程未指明。
! 通常意味着方法作用于对象而不是返回结果。摘自《Programming Ruby》一书:
“危险的”或修改接收者的方法可能会以“!”结尾命名。
通常,以!结尾的方法指示该方法将修改调用它的对象。Ruby将这些方法称为“危险方法”,因为它们更改了其他人可能引用的状态。下面是一个简单的字符串示例:
foo = "A STRING" # a string called foo
foo.downcase! # modifies foo itself
puts foo # prints modified foo
这将输出:
a string
在标准库中,您可以在很多地方看到名称相似的方法对,其中一个带有!一个没有。没有安全方法的方法被称为“安全方法”,它们返回原始方法的副本,其中对副本进行了更改,而被调用者没有更改。下面是没有使用!的相同示例:
foo = "A STRING" # a string called foo
bar = foo.downcase # doesn't modify foo; returns a modified string
puts foo # prints unchanged foo
puts bar # prints newly created bar
这个输出:
A STRING
a string
请记住,这只是一种约定,但许多Ruby类都遵循它。它还可以帮助您跟踪代码中修改的内容。