在Ruby中,有些方法有一个问号(?),它会问一个像include?这样的问题,询问所涉及的对象是否包含在内,然后返回真/假.

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

这是什么意思?

推荐答案

通常,以!结尾的方法表示该方法将以modify the object it's called on结尾.Ruby将其称为"dangerous methods",因为它们改变了其他人可能引用的状态.下面是一个简单的字符串示例:

foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

这将输出:

a string

在标准库中,有很多地方你会看到成对的相似命名的方法,一个有!个,一个没有.没有被调用的方法称为"安全方法",它们返回原始方法的一个副本,并将更改应用于the copy,被调用方保持不变.下面是没有!的同一个例子:

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

Ruby相关问答推荐

Ruby Case语句和固定,不适用于attr_reader

如何在 Ruby 中为链表实现#pop

RVM 和 OpenSSL 的问题

如何使用 define_method 指定方法默认参数?

ActiveRecord::AdapterNotSpecified 数据库配置未指定适配器

如何替换 ruby​​ 中模式的每个实例?

Rspec:应该是(this or that)

Ruby 的 Object#taint 和 Object#trust 方法是什么?

如何调试/显示使用 RestClient 发送的请求

osx bash上的树命令

有效的Electron邮件地址正则表达式?

ruby 是否支持 case 语句中的范围?

如何在不按 Enter 的情况下获取单个字符?

Rails - RSpec - let和let!之间的区别

Puppet/Facter无法检索事实 fqdn:如何修复或规避?

线程安全:Ruby 中的类变量

require File.expand_path(..., __FILE__) 是最佳实践吗?

从 Ruby 中的 URL 获取文件名的好方法是什么?

在 Ruby 中按名称获取一个类?

测试变量是否等于两个值之一