クラスメソッド
クラスから直接呼ぶことができるメソッド
class Car
@@count = 0
def initialize(name)
@name = name
@@count += 1
end
def hello
puts "Hello, I am #{@name}. #{@@count} instance(s)"
end
def self.info #クラスメソッドを書くときは「self」をつける
puts"#{@@count} instance(s)."
end
end
Car.info
上記を実行すると、
0 instanve(s).
と出力される。
これは、インスタンスを生成せず、直接infoメソッドを呼び出しているため。
class Car
@@count = 0
def initialize(name)
@name = name
@@count += 1
end
def hello
puts "Hello, I am #{@name}. #{@@count} instance(s)"
end
def self.info
puts"#{@@count} instance(s)."
end
end
kitt = Car.new('Kitt')
# kitt.hello
Car.info
karr = Car.new('Karr')
# karr.hello
Car.info
hogehoge = Car.new('Hogehoge')
# hogehoge.hello
Car.info
上記を実行すると、
1 instance(s). 2 instance(s). 3 instance(s).
と出力される。
インスタンスを生成してからinfoメソッドを呼び出しているからだ。
クラスから直接呼ぶことでどのようなメリットがあるか良くわからないが、多分便利な機能なんだろうな。
self
のことを少し調べてみたら、クラス内部で書かれる場合、インスタンス変数の参照に利用されるらしい。
class Car
def initialize(name)
# self.nameに引数name を代入する
self.name = name
end
def my_name
p "私の名前は#{self.name}です。"
end
end
class Car
def initialize(name)
@name = name
end
def my_name
p "私の名前は#{@name}です。"
end
end
とは何が違うんだろう?
おまけ
クラスと定数
class Car
REGION = 'USA'
@@count = 0
def initialize(name)
@name = name
@@count += 1
end
def hello
puts "Hello, I am #{@name}. #{@@count} instance(s)"
end
def self.info
puts"#{@@count} instance(s). Region: #{REGION}"
end
end
kitt = Car.new('Kitt')
# kitt.hello
Car.info
karr = Car.new('Karr')
# karr.hello
Car.info
hogehoge = Car.new('Hogehoge')
# hogehoge.hello
Car.info
を実行すると、
1 instance(s). Region: USA 2 instance(s). Region: USA 3 instance(s). Region: USA
が出力される。
定数は大文字。
class Car
REGION = 'USA'
@@count = 0
def initialize(name)
@name = name
@@count += 1
end
def hello
puts "Hello, I am #{@name}. #{@@count} instance(s)"
end
def self.info
puts"#{@@count} instance(s). Region: #{REGION}"
end
end
kitt = Car.new('Kitt')
# kitt.hello
Car.info
karr = Car.new('Karr')
# karr.hello
Car.info
hogehoge = Car.new('Hogehoge')
# hogehoge.hello
Car.info
puts Car::REGION
を実行すると、
1 instance(s). Region: USA 2 instance(s). Region: USA 3 instance(s). Region: USA USA
と出力される。
定数を出力したい場合、 「クラス名::定数名」 と書く。