在红宝石的一些方法有一个问题马克(?)就问一个问题像 include? 那问问,如果所讨论的对象是包括在内,这个然后返回true/false。

但为什么有些方法必须感叹号(!)在其他人没有呢?

这是什么意思?

有帮助吗?

解决方案

在一般情况下,方法结束 ! 表明,该方法将 修改的目的是呼吁.红宝石叫这些为"危险的方法"因为他们改变态,别人可能有一个参考。这里有一个简单的例子:

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

记住这只是一个《公约》,但一个很大的红宝石的课程。它还可以帮助你继续追踪的怎么得到修改在你的代码。

其他提示

感叹号,意味着许多的事情,有时候,你不能告诉你很多从其他比",这是危险的,小心点"

正如其他人所说的那样,在标准方法将它的经常用来表示一个方法,导致对象变本身,但不总是如此。请注意,许多标准方法改变他们的接收器和不拥有一个感叹号(pop, shift, clear),以及一些方法用感叹号不改变自己的接收器(exit!).看看 这篇文章 例如。

其他图书馆可以使用不同的看法。在轨道的一个感叹号,往往意味着该方法将把一个异常的失败而不是失败的默默。

这是一个命名约定,但许多人使用它在微妙的不同方式。在你自己的代码一个好的规则的拇指的是使用它时,一个方法是做什么的"危险的",尤其是当两种方法与名称相同的存在,其中之一是更多的"危险"。"危险"可以指几乎任何东西。

这个命名的公约是解除 方案.

1.3.5命名约定

通过《公约》的名称的程序 总是返回布尔的价值 通常在`?".这种程序 被称为谓词。

通过《公约》的名称的程序 那家商店价值观纳入以前 分配的地点(参见第3.4节) 通常在`!".这种程序 被称为突变的程序。通过 《公约》,值返回的一个 突变的程序是不确定的。

!通常意味着法行为,吁的对象,而不是返回的一个结果。从书 编程的红宝石:

方法都是"危险的",或修改的接收器,可能会被命名为一个尾随"!".

从themomorohoax.com:

砰的一声可以使用以下的方式,以便我的个人偏好。

1)一个活动的记录方法提出了一个错误,如果方法不会做的 什么样的它说它会。

2)一个活动的记录方法保存记录或一种方法,节省了一个 对象(例如带!)

3)一方法做了什么"额外",等员额的地方,或者不会 一些行动。

点是:只有使用爆炸时你真的想是否 这是必要的,拯救其他开发商的烦恼的 检查为什么你正在使用爆炸。

爆炸提供了两个线索其他开发商。

1),这是没有必要保存对象后叫的 法。

2)当你打电话的方法,数据库将会改变。

http://www.themomorohoax.com/2009/02/11/when-to-use-a-bang-exclamation-point-after-rails-methods

这是最准确的说是方法。是的更多 危险令人惊讶 版本。有许多方法,改变没有爆炸,例如 .destroy 和一般的方法只有刘海里一个更安全的替代存在的核心lib。

例如,在我们有阵列 .compact.compact!, 这两种方法改变阵列,但是 .compact! 返回的为零,而不是自我,如果没有无在列,这是更加令人惊讶的不仅仅是返回自己。

唯一不变的方法,我已经找到了一个爆炸是 Kernel's .exit! 这是更加令人惊讶比 .exit 因为你无法赶上 SystemExit 同时,该进程正在关闭。

轨道和Email继续这一趋势在于,它使用的爆炸更令人惊讶的'作用一样 .create! 这引起了错误的失败。

简单的解释:

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! 将不会返回一个新的串的对象,但代替串在地点,完全改变 foo 到它软件.我建议你不要用 downcase! 除非是完全必要的。

!

我喜欢把这作为一个爆炸性的改变,破坏了所有已经在它之前。爆炸或感叹号意味着你是一个永久保存的更改在你的代码。

如果你使用例如红宝石的方法对于全球替代gsub!取代你做的是永久性的。

另一种方法可以想象,将开放一个文本文件,而这样做寻找和替换,随后通过节省。 ! 不同的代码。

另一个有益的提醒,如果你来自世界bash sed -i 有这个效果类似的使得永久保存的变化。

所谓的"破坏性的方法",他们往往要改变原有的副本,对象是参照。

numbers=[1,0,10,5,8]
numbers.collect{|n| puts n*2} # would multiply each number by two
numbers #returns the same original copy
numbers.collect!{|n| puts n*2} # would multiply each number by two and destructs the original copy from the array
numbers   # returns [nil,nil,nil,nil,nil]

底线: ! 方法只是改变价值的对象,他们呼吁,而没有方法 ! 返回操纵价值没有写过的对象的方法是呼吁。

只使用 ! 如果你不计划上需要的原始价值存在的可变你打电话的方法。

我喜欢做这样的:

foo = "word"
bar = foo.capitalize
puts bar

foo = "word"
puts foo.capitalize

而不是的

foo = "word"
foo.capitalize!
puts foo

只是在情况下,我想访问的原始价值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top