为什么是感叹号中使用红宝石的方法吗?
-
03-07-2019 - |
题
在红宝石的一些方法有一个问题马克(?
)就问一个问题像 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
只是在情况下,我想访问的原始价值。