在Ruby语言中,一些方法有一个问号(?),它会询问include?这样的问题,询问是否包含有问题的对象,然后返回true/false。
但是为什么有些方法有感叹号(!),而其他方法没有呢?
什么意思?
发布于 2009-03-04 20:04:42
通常,以!结尾的方法表示该方法将修改它在上调用的对象。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类都遵循它。它还可以帮助您跟踪代码中正在修改的内容。
发布于 2009-03-04 21:59:56
感叹号的意思很多,有时你只能说“这很危险,小心点”。
正如其他人所说,在标准方法中,它通常用于指示导致对象自身变化的方法,但并不总是如此。请注意,许多标准方法更改了它们的接收器,并且没有感叹号(pop、shift、clear),并且一些带有感叹号的方法不会更改它们的接收器(exit!)。请参见this article示例。
其他库可能会以不同的方式使用它。在Rails中,感叹号通常意味着方法将在失败时抛出异常,而不是静默失败。
这是一种命名约定,但许多人使用它的方式略有不同。在您自己的代码中,一个很好的经验法则就是每当一个方法做一些“危险”的事情时使用它,特别是当存在两个同名的方法并且其中一个比另一个更“危险”的时候。“危险”几乎可以表示任何东西。
发布于 2009-03-04 21:44:52
此命名约定从Scheme中取消。
1.3.5命名约定
按照惯例,总是返回布尔值的过程的名称通常以?''. Such procedures are called predicates. By convention, the names of procedures that store values into previously allocated locations (see section 3.4) usually end in!'‘结尾。这样的过程被称为突变过程。按照惯例,变异过程返回的值是未指定的。
https://stackoverflow.com/questions/612189
复制相似问题