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
どちらも阻止することができた。