📜  什么是 ruby 中的感叹号(1)

📅  最后修改于: 2023-12-03 15:21:46.980000             🧑  作者: Mango

什么是 Ruby 中的感叹号

在 Ruby 编程语言中,感叹号(!)是一种常见的命名约定,在方法名称的末尾用来表示对调用对象进行修改或者是会有副作用的操作。即使没有这个感叹号,方法本身的功能可能也会与之相同,但是带感叹号的方法名可以为开发者提供方便的提示。

为什么用感叹号?

在 Ruby 中,类或者模块中的方法名都可以以感叹号结尾,它以上下文中的语境来表示方法的作用。带有感叹号的方法通常被称为「危险方法」,因为它们有可能会修改对象的状态,或者是在失败的时候抛出异常。在某些情况下,也可以将其称之为「破坏性方法」。

这里提到的「危险方法」指的是可能引起副作用的方法,并不是说带感叹号的方法都是危险的。在 Ruby 文档中,著名的 Rails 框架中,甚至是你自己的代码中,都可以看到使用「危险方法」的情况。

换句话说,带有感叹号的方法名本身并没有什么特别之处,只是一种命名约定,它可以为开发者提供方便的提示。

案例解析
upcase

下面是一个常规的字符串方法,将字符串中所有的小写字母转换成大写字母:

irb(main):001:0> text = "hello world"
irb(main):002:0> text.upcase
=> "HELLO WORLD"

而下面这个 upcase! 方法则会在调用之后更改字符串的值:

irb(main):003:0> text.upcase!
=> "HELLO WORLD"
irb(main):004:0> text
=> "HELLO WORLD"
reverse

同样的,对于 reverse 方法,下面是一个常规写法:

irb(main):005:0> text = "hello world"
irb(main):006:0> text.reverse
=> "dlrow olleh"
irb(main):007:0> text
=> "hello world"

而带有感叹号的 reverse! 方法则会修改字符串的值:

irb(main):008:0> text.reverse!
=> "dlrow olleh"
irb(main):009:0> text
=> "dlrow olleh"
感叹号是否都有返回值

不是所有的感叹号都会返回值。有些方法仅发生副作用,如 hash.sort! 或 array.shift!。这些方法的返回值通常是不重要的,它们的副作用更重要。在这种场景下,带感叹号的方法很可能与内置方法的名字相同,但它们所得到的结果却完全不同。

小结

带有感叹号的方法名本身并没有什么特别之处,只是一种命名约定,它为开发者提供了一种对方法作用的提示。在一些场景中,这种提示可能非常有用。带感叹号的方法通常有可能会修改对象的状态,或者是在失败的时候抛出异常。但是这并不是强制的要求,一些带感叹号的方法也可能只修改对象的状态,而不抛出异常。