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 !.
来源
例子:
在Ruby中,某些类型的标点符号用在方法名称的末尾,以表示某种类型的特殊功能。感叹号用于标记更改传递给函数的一个或多个参数的函数。比如看
另一个常见的方法是问号,它表示方法是关于对象的问题,并返回一个布尔值。例如,
实例方法中的约定使用感叹号只是表示该方法将修改实例本身。
同时
1 | mystring.gsub(..) |
不修改
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" |
不带
例如:
假设您有一个plus-one方法,将传递给它的数字加上1。
如果我们有
1 | a = 1 |
那我们就可以了
1 | b=a.plus_one |
还有a=1。但是,如果plus-one是一个破坏性的方法(结果用plus-one调用!)执行以下操作:
1 | a.plus_one! |
将a的值永久更改为2。
以
此类方法对的示例包括排序/排序!对于数组,upcase/upcase!对于琴弦,咕噜/咕噜!对于字符串,以及反转/反转!对于字符串和数组。在每种情况下,如果在对象上调用方法的非爆炸版本,则会得到一个新对象。如果调用bang版本,则在发送消息的同一对象上就地操作。
如果你问大多数Rails的人,他们会说Bang版本!!)表示该方法将引发异常。
我更喜欢的是Ruby最佳实践中的Greg Browns定义,即bang是指有两个版本的方法非常相似,但是bang是您需要更加注意的
你可以用一个感叹号来命名你想要的每个方法。但是,约定是,当方法以任何方式具有侵入性时,都要使用该语法。那么,例如,在一个类car的对象上,这个方法快吗?应该返回正确或错误,但要快!可能应该将某个实例变量@fast更改为true。