冻结对象 |红宝石
任何对象都可以通过调用Object#freeze来冻结。一个冻结的对象不能被修改:我们不能改变它的实例变量,我们不能将单例方法与它关联,如果它是一个类或模块,我们不能添加、删除或修改它的方法。
要测试一个对象是否被冻结,我们可以使用 Object#frozen。如果对象被冻结,则返回true ,否则返回false值。 object 中的 freeze 方法允许我们将一个对象变成一个常量。
请注意,冻结的对象无法解冻。
Syntax: ObjectName.freeze
下面是一个更好理解的例子:
例子:
Ruby
# Ruby program of freezing object
# define a class
class Addition
# constructor method
def initialize(x, y)
@a, @b = x, y
end
# accessor methods
def getA
@a
end
def getB
@b
end
# setter methods
def setA=(value)
@a = value
end
def setB=(value)
@b = value
end
end
# create an object
add = Addition.new(10, 20)
# let us freeze this object
add.freeze
if( add.frozen? )
puts "Addition object is frozen object"
else
puts "Addition object is normal object"
end
# now try using setter methods
add.setA = 30
add.setB = 50
# use accessor methods
add.getA()
add.getB()
puts "A is : #{add.getA()}"
puts "B is : #{add.getB()}"
输出 :
Addition object is frozen object
main.rb:20:in `setA=’: can’t modify frozen Addition (RuntimeError)
from main.rb:39:in `’
在上面的示例中,创建了一个类Addition然后我们创建一个对象名称为add 。通过使用add.freeze方法,对象现在被冻结了,我们不能改变它的方法的值。在这里, add.frozen?方法用于显示对象是否冻结。