Rubyの分割代入でワンライナーでfreeze付き定数を定義してみる

こんにちは!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の方はそりゃそうだって感じですね、、、





勉強になりました。