こんにちは!kossyです!
さて、今回はRubyの分割代入でワンライナーでfreeze付き定数を定義する方法について、
ブログに残してみたいと思います。
環境
Ruby 2.6.3
方法
早速コード全晒しです。
INITIAL_PLAN_PRICE, SECOND_PLAN_PRICE, THIRD_PLAN_PRICE = [1000, 2000,3000].map(&:freeze) INITIAL_PLAN_PRICE => 1000 SECOND_PLAN_PRICE => 2000 THIRD_PLAN_PRICE => 3000
Rubyの分割代入機能は、配列の形で記述しても有効になります。
map(&:freeze)とすることで、全ての定数をfreezeすることが出来ます。
ちなみに、以下の書き方だとfreezeしてくれませんでした、、、
# ダメパターン1 NO_FREEZED_STR_1, NO_FREEZED_STR_2 = ["aaa", "bbb"].freeze NO_FREEZED_STR_1.upcase! => "AAA" NO_FREEZED_STR_1 => "AAA" # 定数のはずなのに破壊的メソッドが有効、、、 # ダメパターン2 NO_FREEZED_STR_1, NO_FREEZED_STR_2 = "aaa", "bbb".freeze NO_FREEZED_STR_1.upcase! => "AAA" NO_FREEZED_STR_2.upcase! Traceback (most recent call last): 5: from /usr/bin/irb:23:in `<main>' 4: from /usr/bin/irb:23:in `load' 3: from /Library/Ruby/Gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>' 2: from (irb):13 1: from (irb):13:in `upcase!'
ダメパターン2の方はそりゃそうだって感じですね、、、
勉強になりました。