[Ruby]定数の定義方法と使い方

Rubyにおける定数とは

アルファベット大文字 ([A-Z]) で始まる識別子。例)ABC、Abc

基本的に途中で変更しない値を定数で宣言する。

*Rubyにおける定数は、再代入可能

メソッド内では宣言することができない

使い方

定数の定義

MEMBER = "masuda"
=> "masuda"

p MEMBER

"masuda"
=> "masuda"

定数の再代入

MEMBER = "masuda"
=> "masuda"

MEMBER = "sasaki"
 warning: already initialized constant MEMBER
 warning: previous definition of MEMBER was here
=> "sasaki"

p MEMBER
"sasaki"
=> "sasaki"

警告文は出るが、再代入される。

定数の変更を阻止したい

破壊的メソッドを阻止

・freezeメソッドを使ってオブジェクトを凍結させる。

MEMBER = "OGINO"
MEMBER.freeze

MEMBER.downcase!
FrozenError: can't modify frozen String
from (pry):187:in `downcase!'

MEMBER = "FUJIWARA"
warning: already initialized constant MEMBER
warning: previous definition of MEMBER was here
=> "FUJIWARA"

破壊的メソッドは阻止できたが、再代入は警告文は出るができてしまう。

再代入を阻止

・定数をモジュール内で定義し、モジュールをfreezeする。

module TEST
  MEMBER = "OGINO"
end

TEST.freeze

TEST::MEMBER = "FUJIWARA"
FrozenError: can't modify frozen Module


TEST::MEMBER.downcase!
=> "ogino"

再代入は阻止できたが、破壊的メソッドは阻止できない。

どっちも阻止

・モジュールと定数どちらもfreezeする。

module TEST
  MEMBER = "OGINO".freeze
end

TEST.freeze

TEST::MEMBER.downcase!
FrozenError: can't modify frozen String


TEST::MEMBER = "FUJIWARA"
FrozenError: can't modify frozen Module

どちらも阻止することができた。

タイトルとURLをコピーしました