为什么在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类都遵循它。 它还可以帮助您跟踪代码中修改的内容。


感叹号意味着很多事情,除了“这很危险,要小心”之外,有时候你不能从中说出很多。

正如其他人所说的那样,在标准方法中,它经常被用来指示一个方法,该方法会导致对象自身发生变异,但并非总是如此。 请注意,很多标准方法会更改接收器,并且没有感叹号( popshiftclear ),并且有些感叹号方法不会更改接收器( 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?