クラスにおける定数

Rubyのクラスの定数であるが、アルファベット大文字・数字、アンダースコアで構成されるのが多い。

USER_NUMBER = 10
COUNTRY_NUMBER = {japan: 10, india: 20, spain: 30}

定数はインスタンスメソッドからでもクラスメソッドからでも、参照できる。

class User
 USER_NUMBER = 10
  
 def self.show_number
   USER_NUMBER
 end

 def show_number
   USER_NUMBER
 end
end

User.show_number #=> 10
User.last.show_number #=> 10
User::USER_NUMBER #=> 10


定数はメソッドの内部では作成できず、必ずクラス構文の直下で作成すること。メソッド内部で作成しようとすると、dynamic constant assignmentとエラーが出る。

[41] pry(main)> class Foo
[41] pry(main)*   def bar  
[41] pry(main)*     VALUE = 10
[41] pry(main)*   end  
[41] pry(main)* end  
SyntaxError: (eval):4: dynamic constant assignment
    VALUE = 10
    ^~~~~


また、定数は外部からも変更できる。

[45] pry(main)> class Foo
[45] pry(main)*   PRICE = 100
[45] pry(main)* end  
=> 100
[46] pry(main)> Foo::PRICE
=> 100
[48] pry(main)> 
[49] pry(main)> Foo::PRICE = 20
(pry):30: warning: already initialized constant Foo::PRICE
(pry):27: warning: previous definition of PRICE was here
=> 20
[52] pry(main)> Foo::PRICE
=> 20