首页 > 解决方案 > 以“!”结尾的 Ruby 方法的含义

问题描述

我是 Ruby 的新手,到目前为止,我已经找到!了一些过于技术性的解释。

假设我们有以下内容:

print "What is your first name?"

first_name = gets.chomp.upcase!

puts "Hi, #{first_name}. How are you?"

!添加到方法中的是什么?这是否意味着每次我#{first_name}在任何后续字符串中使用时,名称中的所有字母都会以大写形式打印?如果我遗漏,代码会受到怎样的影响!

如果可以的话,请用通俗易懂的方式解释它,因为我仍在学习 Ruby 的一些技术术语。

提前致谢。

标签: rubystringmethodsstring-interpolation

解决方案


!添加到方法中的是什么?

没有什么。The!只是消息名称的一部分,就像 the u、 the p、 the c、 the a、 thes和 the eare 一样。它不会更改有关消息的任何内容。

如果我遗漏,代码会受到怎样的影响!

然后你只是发送一条不同的消息。

upcaseupcase!foo和之间绝对没有任何区别bar。它们只是消息名称。如果你写foo,那么你发送消息foo,如果你写bar,那么你发送消息bar,如果你写upcase,那么你发送消息upcase(在你的情况下将被发送到方法String#upcase),如果你写upcase!,那么你发送消息upcase!(在您的案例将被发送到方法String#upcase!)。

以结尾的消息名称!绝对没有什么特别之处?,就像以 or 结尾的消息名称绝对没有什么特别一样,就像以aor bor结尾的消息名称绝对没有什么特别之处一样c

但是,有一些约定。具体而言,公约是:

如果您有两个方法或多或少都做相同的事情,那么更令人惊讶的是用 a 命名的方法!

而已。这就是它的全部。

例如,有方法Process::exitProcess::exit!。他们都做同样的事情(终止进程),但其中一个跳过运行已安装的退出处理程序

因为它们都做同样的事情,它们都可以被命名为“exit”,但是当然,你不能有两个同名的方法(在同一个接收器上)。因此,我们需要以某种方式区分两者。我们可以为两者之一想出一个完全不同的名称,但这也很烦人。

因此,相反,我们将 a 添加!到这两种方法之一。现在,问题是:我们将添加!到两者中的哪一个?根据我们的惯例,“更令人惊讶”的人应该得到!. Ruby 开发人员选择了忽略退出处理程序的方法,我认为这是正确的选择:退出处理程序的全部意义在于它们在您退出时运行,因此退出而不运行退出处理程序的方法令人惊讶,因此应标有!

请注意,这些都与“破坏性”或“突变”无关。Process::exit!不会改变任何东西,也不会破坏任何东西。另请注意,我们使用!来标记一对方法中更令人惊讶的方法。当没有一个名为的方法时,永远不应该有一个名为的方法。foo!foo

特别是,方法没有 a 的事实不能!告诉您有关该方法的任何信息。唯一有 a 的方法告诉!的是有两种方法,您可能应该检查文档以确保您了解这两种方法的作用以及!警告您的“惊喜”是什么关于。而已。


推荐阅读