塩焼きブログ

塩焼きに関しての研究内容を公開しています

Rubyのクラス定数

Timezone = "Europe/London"のようにclass文の中で定義し、クラス内で自由に参照できる。例ではインスタンス変数から参照している。

require "Time"
class Message

  Timezone = "Europe/London"

  def initialize(name)
    ENV['TZ'] = Timezone
    @name = name
  end

  def hello
    "Hello #{@name} " + Time.now.to_s
  end

end

msg = Message.new("Jane")
p msg.hello
# "Hello Jane 2014-09-22 02:40:38 +0100"

クラスメソッドからも呼び出すことができる

require "Time"
class Message

  Timezone = "Europe/London"

  def self.hello(name)
    ENV['TZ'] = Timezone
    "Hello #{name} " + Time.now.to_s
  end

end

p Message.hello("Jane")
# "Hello Jane 2014-09-22 02:41:40 +0100"

::を使えば外部からクラス定数を取得することもできる

class Message
  Timezone = "Europe/London"
end
p Message::Timezone
# "Europe/London"

ただし定数はその名前が示す通り上書きすることはできない

class Message

  Timezone = "Europe/London"

  def initialize(name)
    Timezone = "Asia/Tokyo"
    ENV['TZ'] = Timezone
    @name = name
  end

end
msg = Message.new("Jane")
# example.rb:7: dynamic constant assignment
#     Timezone = "Asia/Tokyo"
#               ^

確認のためクラスメソッドでも定数を使う事はできない

class Message

  Timezone = "Europe/London"

  def self.hello
    Timezone = "Asia/Tokyo"
  end

end

Message.hello
# example.rb:6: dynamic constant assignment
#     Timezone = "Asia/Tokyo"
#               ^

処理の中で値を変更しなければいけないのなら、インスタンス変数やクラス変数を活用する。