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"
#               ^

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA