0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

5/10 勉強記録 Ruby クラスメソッド

Last updated at Posted at 2019-05-10

クラスメソッド
クラスから直接呼ぶことができるメソッド


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
と出力される。
定数を出力したい場合、 「クラス名::定数名」 と書く。

0
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?