Ruby

[Ruby]クラスとインスタンスを振り返ってみる。

ここのところRailsしかやっておらず、そもそものRubyとは何か、オブジェクト指向とは何か、もうすっかり忘れていたので、こんなコードを書いてみました。

コード

class Dog
  @@hoeru = "うぉぉぉぉん"
  @@count = 0

  def initialize
    puts  "新しいペットの名前は?"
    @name = gets.chomp
    puts "作成しました。#{@name}です。"
    Dog.count_dogs
  end

  def self.how_many_dogs
    return "今は#{@@count}匹いるよ!"
  end

  def self.count_dogs
    @@count += 1
  end

  def hoeru
    puts @@hoeru
  end
end

dog = Dog.new
Dog.how_many_dogs
dog.hoeru

説明してみたいと思います。

クラスメソッド

Dog.newは、クラスメソッドです。新しいインスタンスを作成し、initializeメソッドが実行されます。これによってインスタンスが初期化されるわけですね。

以下はクラスメソッドを定義しています。

  def self.how_many_dogs
    return "今は#{@@count}匹いるよ!"
  end

クラスメソッドはDog.newと同じで、Dog.how_many_dogsと書くことで呼び出せます。
クラスで共通の情報を使った処理に使用します。

クラス変数

@@hoeru
@@count

これはクラス変数です。クラスの中ならどこからでも参照できる変数です。クラス内で共通する情報を定義しておきます。

インスタンス変数

@nameはインスタンス変数です。
railsではコントローラで定義され、ビューで参照することができます。
そのクラス内であればどこからでも参照できます。

インスタンスって何かなって考えると、説明に窮してしまいます。
インスタンスは、クラスに基づいて生み出されたオブジェクトのことです。
基本的には1度、変数に入れておいて使うみたいですね。そして変数に新たな値を上書きしてしまえば、そのインスタンスはどこかに行ってしまうようです。
うーんこの辺がいまいち分かっていないです。
えらい人たちが色々試行錯誤してきて、とりあえずクラスとインスタンスっていうやり方が一番合理的でスムーズに行くと思ったんでしょう。

インスタンスメソッド

  def hoeru
    puts @@hoeru
  end

これはインスタンスメソッドです。
インスタンスに使わせたいメソッドを定義します。
うーん、この場合はクラスメソッドで良いような気がしますね。
Dog.で使いたいメソッドはクラスメソッドで、dog.で使いたいメソッドはインスタンスメソッドで、という感じでしょうか。

うーん…… よくわかっていないです。
勉強しなおそう……