有啥用!登录一些红宝石方法[重复]
Posted
技术标签:
【中文标题】有啥用!登录一些红宝石方法[重复]【英文标题】:what is the use of ! sign in some ruby methods [duplicate]有什么用!登录一些红宝石方法[重复] 【发布时间】:2011-09-06 16:36:07 【问题描述】:可能重复:Why are exclamation marks used in Ruby methods?
大家好,
在 ruby/rails 中,我看到一些方法以 !像这样签名
before_filter :authenticated!
只是想知道经过身份验证的意思是什么!,'!'签到
提前致谢
干杯
同人
【问题讨论】:
抱歉重复了..没看到... 【参考方案1】:!
字符用于表示破坏性方法:这是一种永久改变传递给它的一个或多个变量的方法。
例如:
假设您有一个 plus_one 方法,可以将传递给它的数字加 1。
如果我们有
a = 1
那我们就可以了
b=a.plus_one
并且仍然有 a = 1。但是,如果 plus_one 是一种破坏性方法(因此使用 plus_one 调用!),请执行以下操作:
a.plus_one!
会将 a 的值永久更改为 2。
【讨论】:
太糟糕的整数是不可变的对象,所以这个例子让我很恼火;你不能对整数使用破坏性方法。【参考方案2】:按惯例在instance方法中使用感叹号只是表示该方法将修改实例本身。
虽然
mystring.gsub(..)
不会修改mystring
,
mystring.gsub!(..)
会的。
【讨论】:
【参考方案3】:区别:举例(gsub/gsub!)
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 将返回该值,但不会修改原始字符串。这通常是!
的使用方式,没有它,什么都不会被修改。用它来修改原件
【讨论】:
【参考方案4】:以!
结尾的方法通常会转换它被调用的对象,而没有!
的方法会执行操作并返回一个新对象。它们在Ruby 中被称为“危险方法”,因为它们可能会改变说明其他人可能有参考。
这种方法对的示例包括排序/排序!对于数组,大写/大写!对于字符串,chomp/chomp!对于字符串,以及反向/反向!对于字符串和数组。在每种情况下,如果您在对象上调用该方法的非爆炸版本,您将获得一个新对象。如果您调用 bang 版本,您将在向其发送消息的同一对象上就地操作。
【讨论】:
“以!
结尾的方法转换它被调用的对象”:这是不正确的。 !
的使用只是一个约定。
句子已修改。感谢您的通知。
感谢@Piyush 的回答【参考方案5】:
作为约定,标识符?用作谓词名称和标识符!用于比同名但不带 ! 的方法更具破坏性(或更危险)的方法。
Source
例子:
lstrip
将返回一个删除了前导空格的新字符串,因此原始字符串未被修改。
lstrip!
会在原地修改字符串
【讨论】:
【参考方案6】:如果你问大多数 Rails 人,他们会说 bang 版本 (!) 意味着该方法会抛出异常。
我比较喜欢的是 Ruby Best Practices 中 Greg Browns 的定义,就是一个 bang 表示一个非常相似的方法有两个版本,但是 bang 的那个你需要多加注意
【讨论】:
【参考方案7】:!
可以用作 Ruby 方法名称中的最后一个字符(?
和 =
也可以)。它通常用于表示“危险”方法(例如,就地改变值)或您应该注意的一般方法。
【讨论】:
【参考方案8】:您可以在末尾使用感叹号来命名您想要的每个方法。但是,约定是当方法以任何方式侵入时使用该语法。那么,例如在 Car 类的对象上,该方法快吗?应该返回 true 或 false 但很快!也许应该将一些实例变量 @fast 更改为 true。
【讨论】:
【参考方案9】:在 Ruby 中,某些类型的标点符号用于方法名称的末尾以表示某种类型的特殊功能。感叹号用于标记更改传递给它们的一个或多个参数的函数。例如,查看gsub
和gsub!
之间的区别。
另一个常见的是问号,它表示方法是关于对象的问题,并返回一个布尔值。例如,include?
。如果以其他语言实现,其中大部分功能通常以 is
或 has
前缀或类似前缀开头。
【讨论】:
以上是关于有啥用!登录一些红宝石方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Json.stringify() 有啥用,没有 stringify [重复]