1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】`freeze`メソッドって以外とややこしい...??

Last updated at Posted at 2024-12-14

どうもこんにちは。完全なるメモ書きです。

freezeメソッドが実行されたオブジェクトの特徴

  1. 破壊的な操作ができません
  2. オブジェクトの代入ができます
  3. 自作クラスのインスタンス変数を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に対しては、値を追加しようとしたができない。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?