クラスとインスタンスのメソッド

 クラスとインスタンスに関するメソッドについて説明したいと思います。

kim-shun.hatenablog.com

 過去に記事にした通り、クラスとは「設計図」のことであり、インスタンスとは「設計図」の中で使う「データ」のことです。今回説明するのはその中で登場する具体的なメソッドです。

 

  1. クラスメソッド「self」
  2. インスタンス変数とローカル変数
  3. initializeメソッド

 

 以上の流れで説明していきます。

 

1. クラスメソッド「self」

 クラスが使用できるメソッドには「new」の他に「self」があります。下記のような記述で「こちらの車を販売しています」という文字列を出力させることができます。クラスメソッドはクラスで共通の情報を使った処理に使用します。

class Car
def self.sell
puts "こちらの車を販売しています"
end
end

Car.sell

 実行結果は以下の通りです。

こちらの車を販売しています

 

 

2. インスタンス変数とローカル変数

 下記のコードを実行するとエラーが起きます。なぜなら、car_name、car_priceという変数を複数のインスタンスメソッド内で使用しているからです。このcar_nameやcar_priceのように頭文字に何もついていない変数のことを「ローカル変数」と言います。ローカル変数は、記述しているインスタンスメソッド内でしか使えません。

class Car

def self.sell
puts "こちらの車を販売しています"
end

def initialize(name, price)
car_name = name
car_price = price
end
 
def introduce
puts "#{car_name}#{car_price}円です"
end
end

Car.sell

tanto = Car.new("タント", 5000000)
n_box = Car.new("N-BOX", 6000000)
hustler = Car.new("ハスラー", 7000000)

tanto.introduce
n_box.introduce
hustler.introduce

 このエラーを解消する方法が、インスタンス変数の使用です。インスタンス変数であれば、別のインスタンスメソッド内でも使用できます。

class Car

def self.sell
puts "こちらの車を販売しています"
end

def initialize(name, price)
@car_name = name
@car_price = price
end
 
def introduce
puts "#{@car_name}#{@car_price}円です"
end
end

Car.sell

tanto = Car.new("タント", 5000000)
n_box = Car.new("N-BOX", 6000000)
hustler = Car.new("ハスラー", 7000000)

tanto.introduce
n_box.introduce
hustler.introduce

 インスタンス変数とは頭文字に「@」がついた変数です。car_name、car_priceに「@」をつけることでエラーは解消されます。実行結果は以下の通りです。

こちらの車を販売しています
タントは5000000円です
N-BOXは6000000円です
ハスラーは7000000円です

 

 

 

3. initializeメソッド

 initializeメソッドとは、インスタンスが生成されるタイミングで呼び出されるメソッドです。Rubyのクラスから生成されるインスタンスでは、initializeメソッドは自動的に実行されています。インスタンス生成時に新たに処理を追加したい場合にこのinitializeメソッドを定義します。

 

class Car
def initialize
puts "こちらの車を販売しています"
end
end

Car.new

 「Car.new」の記述だけで下記の文字列が出力されます。

こちらの車を販売しています

 

 

 では今度は著者、記事タイトル、本文の情報を扱うArticleクラスでinitializeメソッドを使ってみます。

class Article
def author(author)
author
end

def title(title)
title
end

def content(content)
content
end
end

article = Article.new
puts article.author("田中")
puts article.title("今日の天気")
puts article.content("晴れ")

 この上記のコードでinitializeメソッドを用いると下記のようになります。

class Article

def initialize(author, title, content)
@author = author
@title = title
@content = content
end

def author
@author
end

def title
@title
end

def content
@content
end

end

article = Article.new("高橋", "今日の天気", "晴れ")
puts article.author
puts article.title
puts article.content

 このようにすることで、著者、記事タイトル、本文の処理の定義がインスタンス生成と同時に実行されるようになります。さらにそれらをそれぞれインスタンス変数に代入することで複数のインスタンスメソッド内で使用可能となります。

def author
@author
end

def title
@title
end

def content
@content
end

 この記述はただインスタンス変数の値を返すためだけのメソッドです。

 

 

 以上です。クラスとインスタンスに関しては自分の中でもう少し理解が深まった時に再度記事にしていきたいと思います。