クラスとインスタンスに関するメソッドについて説明したいと思います。
kim-shun.hatenablog.com
過去に記事にした通り、クラスとは「設計図」のことであり、インスタンスとは「設計図」の中で使う「データ」のことです。今回説明するのはその中で登場する具体的なメソッドです。
- クラスメソッド「self」
- インスタンス変数とローカル変数
- initializeメソッド
以上の流れで説明していきます。
1. クラスメソッド「self」
クラスが使用できるメソッドには「new」の他に「self」があります。下記のような記述で「こちらの車を販売しています」という文字列を出力させることができます。クラスメソッドはクラスで共通の情報を使った処理に使用します。
class Car
def self.sell
puts "こちらの車を販売しています"
end
end
Car.sell
実行結果は以下の通りです。
下記のコードを実行するとエラーが起きます。なぜなら、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円です
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
この記述はただインスタンス変数の値を返すためだけのメソッドです。
以上です。クラスとインスタンスに関しては自分の中でもう少し理解が深まった時に再度記事にしていきたいと思います。