如何凍結 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 次瀏覽

開啟你的職業生涯

完成課程獲取認證

開始
廣告
© . All rights reserved.