Ruby - 带有和没有感叹号的方法之间的区别是什么?

时间:2014-05-09 03:17:46

标签: ruby sorting

例如,我检查了某些方法的文档,比如sort。看起来.sort.sort!之间的唯一区别是,self到位排序,另一个返回数组。我有点不清楚这意味着什么 - 他们似乎有效地做了同样的事情。

有人能帮助我更好地理解这一点吗?

3 个答案:

答案 0 :(得分:3)

何时使用Bang方法

从技术上讲,惊叹号(或爆炸声)并不是本质上意味着什么。它只是方法名称中允许的字符。然而,在实践中,通常采用所谓的爆炸方法:

  • 就地更改对象。例如,#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'