Rubyリファレンス: Home

freeze (Object)

Edit   History

標準クラス・モジュール > Object > freeze

obj.freeze

freezeメソッドは、オブジェクトを凍結、つまり変更不可にします。凍結状態のオブジェクトを変更しようとすると、Ruby 1.8では例外TypeErrorが、Ruby 1.9では例外RuntimeErrorが発生します。

凍結状態を調べるには、frozen?メソッドを使います。凍結状態を元に戻すメソッドはありません。

標準クラスのオブジェクトでは、凍結したあとで破壊的なメソッド(レシーバ自身を変更するメソッド)を呼び出すと例外が発生します。

s = "hello"
s.freeze
s.upcase! rescue p $!
#<TypeError: can't modify frozen string>     (Ruby 1.8)
#<RuntimeError: can't modify frozen string>  (Ruby 1.9)

また、凍結状態のオブジェクトでは次のことができなくなります。

class Cat
  attr_accessor :name
  def initialize(name)
    @name = name
  end
end
 
cat = Cat.new("Tama")
cat.freeze
(cat.name = "Piko") rescue p $!
#<TypeError: can't modify frozen object>     (Ruby 1.8)
#<RuntimeError: can't modify frozen object>  (Ruby 1.9)

ただし、インスタンス変数の参照先のオブジェクトは変更可能です。自作のクラスで参照先のオブジェクトまで変更不可にするには、freezeメソッドを再定義する必要があります。

cat = Cat.new("Tama")
cat.freeze
puts cat.name.replace("Piko")
Piko

関連項目