Ruby方法中的 ! 有什么用

what is the use of ! sign in some ruby methods

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why are exclamation marks used in Ruby methods?

嗨,大家好,

在Ruby/Rails中,我看到了一些方法的最终结果!象符号

1
before_filter :authenticated!

只是想知道认证是什么意思!,"!"签名

提前谢谢

干杯

萨梅拉


As a convention, identifier? are used as predicate names, and identifier! are used for the more destructive (or more dangerous) methods than the method which have same name without !.

来源

例子:

lstrip将返回一个删除前导空格的新字符串,从而取消对原始字符串的修改。lstrip!将就地修改字符串。


在Ruby中,某些类型的标点符号用在方法名称的末尾,以表示某种类型的特殊功能。感叹号用于标记更改传递给函数的一个或多个参数的函数。比如看gsubgsub!的区别。

另一个常见的方法是问号,它表示方法是关于对象的问题,并返回一个布尔值。例如,include?。如果用其他语言实现这些功能,则大多数功能通常以ishas前缀或类似前缀开始。


实例方法中的约定使用感叹号只是表示该方法将修改实例本身。

同时

1
mystring.gsub(..)

不修改mystring

1
mystring.gsub!(..)

威尔。


区别:通过示例(gsub/gsub!)

1
2
3
4
5
6
7
string ="this_string"
string.gsub!("this","that")
puts string #=> string ="that_string"

string ="this_string"
string.gsub("this,"that")
puts string #=> string is stil ="
this_string"

不带!的gsub将返回值,但不会修改原始字符串。这通常是使用!的方式,如果不使用它,则不进行任何修改。用它修改原稿


!字符用于表示破坏性方法:即永久改变传递给它的一个或多个变量的方法。

例如:

假设您有一个plus-one方法,将传递给它的数字加上1。

如果我们有

1
a = 1

那我们就可以了

1
b=a.plus_one

还有a=1。但是,如果plus-one是一个破坏性的方法(结果用plus-one调用!)执行以下操作:

1
     a.plus_one!

将a的值永久更改为2。


!结尾的方法通常转换它所调用的对象,而不是没有!的方法,后者执行一个操作并返回一个新对象。它们在ruby中被称为"危险方法",因为它们可能会更改其他人可能引用的状态。
此类方法对的示例包括排序/排序!对于数组,upcase/upcase!对于琴弦,咕噜/咕噜!对于字符串,以及反转/反转!对于字符串和数组。在每种情况下,如果在对象上调用方法的非爆炸版本,则会得到一个新对象。如果调用bang版本,则在发送消息的同一对象上就地操作。


如果你问大多数Rails的人,他们会说Bang版本!!)表示该方法将引发异常。

我更喜欢的是Ruby最佳实践中的Greg Browns定义,即bang是指有两个版本的方法非常相似,但是bang是您需要更加注意的


!可以用作ruby方法名中的最后一个字符(?=也可以)。它通常用于表示"危险"的方法(例如,在适当的地方改变一个值),或者通常是您应该注意的方法。


你可以用一个感叹号来命名你想要的每个方法。但是,约定是,当方法以任何方式具有侵入性时,都要使用该语法。那么,例如,在一个类car的对象上,这个方法快吗?应该返回正确或错误,但要快!可能应该将某个实例变量@fast更改为true。