首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在Ruby方法中使用感叹号?

为什么在Ruby方法中使用感叹号?
EN

Stack Overflow用户
提问于 2009-03-04 20:02:28
回答 10查看 166.2K关注 0票数 615

在Ruby语言中,一些方法有一个问号(?),它会询问include?这样的问题,询问是否包含有问题的对象,然后返回true/false。

但是为什么有些方法有感叹号(!),而其他方法没有呢?

什么意思?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-03-04 20:04:42

通常,以!结尾的方法表示该方法将修改它在上调用的对象。Ruby将这些称为“危险方法”,因为它们改变了其他人可能会引用的状态。下面是一个简单的字符串示例:

代码语言:javascript
复制
foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

这将输出:

代码语言:javascript
复制
a string

在标准库中,有很多地方可以看到命名相似的方法对,一个有!,另一个没有。没有的方法称为“安全方法”,它们返回原始方法的副本,并对应用更改,而被调用者保持不变。下面是不带!的相同示例

代码语言:javascript
复制
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

这将输出以下内容:

代码语言:javascript
复制
A STRING
a string

请记住,这只是一个约定,但很多Ruby类都遵循它。它还可以帮助您跟踪代码中正在修改的内容。

票数 692
EN

Stack Overflow用户

发布于 2009-03-04 21:59:56

感叹号的意思很多,有时你只能说“这很危险,小心点”。

正如其他人所说,在标准方法中,它通常用于指示导致对象自身变化的方法,但并不总是如此。请注意,许多标准方法更改了它们的接收器,并且没有感叹号(popshiftclear),并且一些带有感叹号的方法不会更改它们的接收器(exit!)。请参见this article示例。

其他库可能会以不同的方式使用它。在Rails中,感叹号通常意味着方法将在失败时抛出异常,而不是静默失败。

这是一种命名约定,但许多人使用它的方式略有不同。在您自己的代码中,一个很好的经验法则就是每当一个方法做一些“危险”的事情时使用它,特别是当存在两个同名的方法并且其中一个比另一个更“危险”的时候。“危险”几乎可以表示任何东西。

票数 162
EN

Stack Overflow用户

发布于 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!'‘结尾。这样的过程被称为突变过程。按照惯例,变异过程返回的值是未指定的。

票数 82
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/612189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档