どうもこんにちは。完全なるメモ書きです。
freeze
メソッドが実行されたオブジェクトの特徴
- 破壊的な操作ができません
- オブジェクトの代入ができます
- 自作クラスのインスタンス変数をfreezeしない限り、変更できます
オブジェクトが変更できる例
CONST_LIST_A = ['001', '002', '003']
begin
CONST_LIST_A.map{|id| id << 'hoge'}
rescue
end
CONST_LIST_B = ['001', '002', '003'].freeze
begin
CONST_LIST_B.map{|id| id << 'hoge'}
rescue
end
p CONST_LIST_A #=> ["001hoge", "002hoge", "003hoge"]
p CONST_LIST_B #=> ["001hoge", "002hoge", "003hoge"]
map
メソッドは、配列の中身を取り出し、編集し、再代入するという動作を行っている。つまり、オブジェクトの代入を行っているため、freeze
メソッドでオブジェクトを凍結していたとしても変更を行うことが可能。
オブジェクトが変更できない例
hoge = "hoge".freeze
hoge.upcase!
CONST_LIST_C = ['001', '002', '003'].freeze
begin
CONST_LIST_C.map!{|id| id << 'hoge'}
rescue
end
CONST_LIST_D = ['001', '002', '003'].freeze
begin
CONST_LIST_D.push('add')
rescue
end
p hoge
p CONST_LIST_C #=> ["001", "002", "003"]
p CONST_LIST_D #=> ["001", "002", "003"]
hoge
,CONST_LIST_C
に対しては、破壊的な変更を行おうとしたため、変更されない。
CONST_LIST_D
に対しては、値を追加しようとしたができない。