例如,我检查了某些方法的文档,比如sort。看起来.sort
和.sort!
之间的唯一区别是,self
到位排序,另一个返回数组。我有点不清楚这意味着什么 - 他们似乎有效地做了同样的事情。
有人能帮助我更好地理解这一点吗?
答案 0 :(得分:3)
从技术上讲,惊叹号(或爆炸声)并不是本质上意味着什么。它只是方法名称中允许的字符。然而,在实践中,通常采用所谓的爆炸方法:
就地更改对象。例如,#sort!
会自行排序,而#sort
会返回通过排序self创建的 new 数组。
如果没有进行任何更改,某些bang方法会返回nil,这会导致方法链出现问题。例如:
'foo'.sub 'x', 'y'
# => "foo"
'foo'.sub! 'x', 'y'
#=> nil
当您想要将方法标记为创建显着副作用,产生破坏性操作或需要额外注意或注意时,请使用bang方法。这很大程度上是按照惯例,如果你这么倾向,你可以让你所有的方法成为方法。
答案 1 :(得分:1)
带爆炸(!)的方法意味着需要更加谨慎。因此,要么就地修改而不是就地修改(如果你正在修改对象 - 你最好确定你真的想要),或者在其他情况下如find_by和find_by! (参见here)如果没有找到记录,则会导致异常,而且不会导致异常。
你能猜出哪一个做了,哪一个不会导致例外?
答案 2 :(得分:-1)
带有感叹号的方法会改变它们被调用的实际对象,而不带方法的方法只会返回一个被操作的新对象。 即。
pizza = 'pepperoni'
pizza.capitalize
现在披萨变量仍将等于'pepperoni'。 如果我们再打电话
pizza.capitalize!
披萨变量现在等于'Pepperoni'