この記事で分かること
読み流すだけで頭に入る設計をしていますので、立ち止まらずに一気に読んでみましょう。
また、各項目にはコードを記載しているので実際に手を動かしながら確認してみましょう!
(右上のアイコンを押すことで簡単にコピーできます。)
まずは用語を理解しよう
class Yamada
end
tarou = Yamada.new
最初に「どこをクラスと呼ぶか、インスタンスと呼ぶか」を覚えましょう。
「Yamada」というクラスを定義しました。class と記述されているためわかりやすいですね。
一方、「tarou」というのは「Yamadaのインスタンス」です。
インスタンスを定義する時は インスタンス名=クラス名.newとします。
これは「Yamadaというクラスに対してnewメソッドを行い、tarouというインスタンスを新たに生成した」、ということです。
次にイメージしてみよう
クラスは名字(家系)・インスタンスは子供のイメージです。
class Yamada
Yamada家の持つ能力
end
tarou = Yamada.new
#tarouというインスタンス(子供)が新たに生まれた
jirou = Yamada.new
#jirouというインスタンス(子供)が新たに生まれた
Yamadaクラスから作られたインスタンスはYamadaの特性をすべて引き継いでいます。
人間で言う遺伝のように、tarouもjirouもYamada家の持つ能力を全て使えます。
インスタンスメソッドをさくっと理解
一番最初に理解したいのは「インスタンスメソッド」について。
class Yamada
def fire
p '手から炎がでます'
end
end
tarou = Yamada.new
jirou = Yamada.new
ここでは「Yamada」というクラスの中に「fire」というインスタンスメソッドがあります。
インスタンスメソッドとは、「Yamada家の持つ能力」のこと。
class Yamada
def fire
p '手から炎がでます'
end
#これがインスタンスメソッド
end
tarou = Yamada.new
jirou = Yamada.new
tarou.fire
#tarouに対してfireを適用している
jirou.fire
#jirouもfireを使うことができる
インスタンス(子供)である「tarou」に対して、「fire」を適用しています。
「太郎、fireを使うんだっ!」って感じですね。
このコードを実行すると「手から炎が出ます」が出力されることが確認できるので、やってみましょう。
また、jirouも山田家の子供なのでfireを使うことができます。
ついでにクラスメソッドをさくっと理解
クラスから生まれたインスタンス(山田家から生まれた子どもたち)が使えるのが「インスタンスメソッド」。
対して、クラスメソッドとは「山田家に対してアクションを行うメソッド」のこと。
class Yamada
#最初は子供は0人
@@children_count = 0
def self.children_counter
#これがクラスメソッド
p "山田家には子供が#{@@children_count}人います"
end
def initialize
#インスタンスが作られる=子供が生まれるたびに1つカウントが増える
@@children_count += 1
end
def fire
p '手から炎がでます'
end
end
tarou = Yamada.new
#tarouというインスタンス(子供)が生まれる
jirou = Yamada.new
#jirouというインスタンス(子供)が生まれる
Yamada.children_counter
#クラスに対してクラスメソッドを実行している
「山田家に何人子供がいるか(何個インスタンスが作られたか)」を知っているのは誰でしょうか?
すでに独立したtarouはjirouが生まれたことを知りません。
インスタンス同士はお互いに関連性を持たないためです。
よって、「山田家に直接聞く」のが正攻法ですね。
クラスメソッドを使用する際は クラス名.クラスメソッド という記述になります。
クラスメソッドの特徴として「メソッド名にselfがつく」があるので、見つけやすいですね。
応用問題
最後に応用編です。
class Yamada
def fire
p '手から炎がでます'
end
end
class Tanaka
def water
p '水を生み出します'
end
end
tarou = Yamada.new
hanako = Tanaka.new
hanako.fire
今回はクラスを2つ作成しました。
炎を操る山田家と、水を操る田中家です。
さて、田中家の子孫であるhanakoはfireを使うことができるでしょうか?
上記のコードを自分のPCで実行してみましょう。
undefined method `fire' for #<Tanaka:0x00007fee5d097da8> (NoMethodError)
このようなエラー文が表示されるはずです。
日本語に訳してみましょう。
fireというメソッドは<田中から作られたインスタンス>には定義されていないよ。(そんなメソッドはないです!)
お気付きの通り、fireは山田家だけの技ですから、hanakoが使おうとするとエラーになってしまいます。
class Yamada
def fire
p '手から炎がでます'
end
end
class Tanaka
def water
p '水を生み出します'
end
end
tarou = Yamada.new
hanako = Tanaka.new
tarou.fire
hanako.water
こうすればうまく動きますね。