为什么在Ruby方法中使用感叹号?
  在Ruby中,有些方法有一个问号( ? ),提出一个像include?这样的问题include?  询问是否包含所讨论的对象,然后返回true / false。 
  但为什么有些方法在其他人不知道的地方有惊叹号( ! )? 
这是什么意思?
  一般来说,以!结尾的方法!  表明该方法将修改它所调用的对象 。  Ruby把这些称为“ 危险的方法 ”,因为它们改变了别人可能参考的状态。  这是一个简单的字符串示例: 
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
请记住,这只是一个约定,但很多Ruby类都遵循它。 它还可以帮助您跟踪代码中修改的内容。
感叹号意味着很多事情,除了“这很危险,要小心”之外,有时候你不能从中说出很多。
  正如其他人所说的那样,在标准方法中,它经常被用来指示一个方法,该方法会导致对象自身发生变异,但并非总是如此。  请注意,很多标准方法会更改接收器,并且没有感叹号( pop , shift , clear ),并且有些感叹号方法不会更改接收器( exit! )。  例如,看这篇文章。 
其他库可能以不同的方式使用它 在Rails中,感叹号通常意味着该方法会在失败时抛出异常,而不是无故失败。
这是一个命名约定,但许多人以不同的方式使用它。 在你自己的代码中,一个好的经验法则就是在方法做一些“危险的事情”时使用它,尤其是当两个名称相同的方法存在时,其中一个方法比另一个更危险。 “危险”可能意味着几乎任何东西。
该命名约定从Scheme中解除。
1.3.5命名约定
按照惯例,总是返回一个布尔值的过程的名字通常以``?'结尾。 这样的过程被称为谓词。
按照惯例,将值存储到先前分配的位置(参见3.4节)的过程的名称通常以“!”结尾。 这些程序被称为突变程序。 按照惯例,突变过程返回的值是未指定的。
链接地址: http://www.djcxy.com/p/44835.html上一篇: Why are exclamation marks used in Ruby methods?
下一篇: Can I invoke an instance method on a Ruby module without including it?
