如何冻结 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

让我们考虑一个稍微复杂的示例,其中我们将使用 gettersetter,然后将其中一个方法设置为 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)

更新时间:2022 年 1 月 25 日

322 次浏览

开启你的职业生涯

完成课程获取认证

开始
广告