如何冻结 Ruby 中的对象?
有时会出现一种情况,即我们需要冻结对象实例,这样它才不能被实例化或修改,在 Ruby 中,我们可以借助 freeze 关键字来实现这一点。
方法是调用 Object#freeze 语句。
当我们冻结一个对象时,我们基本上将它变成一个常量,并且应该注意,一旦一个对象被冻结,就无法取消冻结。
语法
freeze 一个对象的语法如下所示。
Object.freeze
现在我们对 freeze 有了一定的了解,让我们举几个例子来了解它的工作原理。
示例 1
考虑下面的代码
veggies = ["spinach", "cucumber", "potato"] veggies.freeze veggies << "cauliflower"
在上面的代码中,有一个名为 veggies 的数组,其中包含三个字符串,然后在下一行,我调用了 freeze 方法,最后,我尝试向数组中添加另一个字符串。
输出
main.rb:3:in `<main>': can't modify frozen Array (RuntimeError)
示例 2
让我们考虑一个稍微复杂的示例,其中我们将使用 getter 和 setter,然后将其中一个方法设置为 frozen。考虑以下代码。
# Freezing object example # define a class class Subtract # constructor method def initialize(x, y) @first, @second = x, y end # accessor methods def getA @first end def getB @second end # setter methods def setA=(value) @first = value end def setB=(value) @second = value end end # create an object add = Subtract.new(10, 20) # let us freez this object add.freeze if( add.frozen? ) puts "Frozen object" else puts "Normal object" end # now try using setter methods sub.setA = 30 sub.setB = 50 # use accessor methods sub.getA() sub.getB() puts "First is : #{sub.getA()}" puts "Second is : #{sub.getB()}"
输出
Frozen object main.rb:37:in `<main>': undefined local variable or method `sub' for main:Object (NameError)
广告