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

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

这是什么意思?


当前回答

!

我喜欢把这看作是一个爆炸性的变化,它摧毁了之前的一切。Bang或感叹号表示您正在对代码进行永久保存的更改。

如果你使用Ruby的方法进行全局替换,sub!你所做的替换是永久的。

你可以想象的另一种方式是,打开一个文本文件,进行查找和替换,然后保存。! 在代码中执行相同的操作。

如果您来自bash世界,另一个有用的提醒是sed -i具有永久保存更改的类似效果。

其他回答

通常,以!结尾的方法指示该方法将修改调用它的对象。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类都遵循它。它还可以帮助您跟踪代码中修改的内容。

我的回答解释了在Ruby on Rails (RoR)模型验证上下文中带有感叹号/shebangs的Ruby方法的重要性。

本质上,无论何时开发人员定义模型验证(此处解释),他们的最终目标都是拒绝数据库记录更改,并在提交了无效数据以更新相关记录的情况下引发/抛出相关异常。

RoR ActiveRecord gem定义了各种模型操作方法(Ruby on Rails指南)。在这些方法中,有效的?方法是唯一一个无需数据库操作/修改就能触发验证的方法。其余的方法尝试更改数据库。

这些方法在运行时触发回调。列表中的一些方法有一个带shebang的姐妹方法。这两者之间有什么区别?它与记录验证失败时返回的回调形式有关。

不带感叹号/shebang的方法在记录验证失败时只返回布尔值false,而带shebang的方法会引发/抛出异常,然后可以在代码中适当地处理。

从themomorohoax.com:

刘海有以下几种用法,依我个人喜好而定。

如果活动记录方法没有这样做,则会引发错误 就像它说的那样。 活动记录方法保存记录或方法保存 对象(例如strip!) 方法做一些“额外的”事情,比如张贴到某个地方 一些行动。

关键是:只有在你真正想过是否要使用爆炸的时候 这是必要的,可以省去其他开发人员不得不这样做的烦恼 检查你为什么要使用爆炸声。

爆炸为其他开发者提供了两个线索。

方法调用后,没有必要保存对象 方法。 当你调用这个方法时,db会被改变。

! 通常意味着方法作用于对象而不是返回结果。摘自《Programming Ruby》一书:

“危险的”或修改接收者的方法可能会以“!”结尾命名。

提醒一下,因为我自己也经历过。

在Ruby中,!改变对象并返回它。否则它将返回nil。

因此,如果你正在对一个数组进行某种操作,并调用方法.compact!没有东西要压缩,它会返回nil。

例子:

arr = [1, 2, 3, nil]
arr.compact!
=> [1, 2, 3]

Run again arr.compact!
=> nil

如果你需要在一行中使用数组arr,最好再次显式返回它,否则你将得到nil值。

例子:

arr = [1, 2, 3]
arr.compact! => nil
arr # to get the value of the array