Ruby 練習問題集 クラス変数とクラスメソッド

「クラスインスタンスの初期化」と「クラスメソッドとインスタンスメソッドの定義」のお話。今回は割とすんなりできた。


クラス変数とクラスメソッド - Ruby 練習問題集 - Ruby on Rails with OIAX

次のプログラムは、実行するとエラーが発生します。正しく動作するようにプログラムを修正してください。

class Robot
  def self.ping
    @@count += 1
  end

  def count
    @@count
  end
end

r1 = Robot.new
r1.ping

r2 = Robot.new

r2.ping
r1.ping

puts Robot.count
なお、Robotクラスの本来の仕様は次の通りです:

インスタンスメソッドpingを呼ぶとクラスの共有カウンタが1ずつ増加する。
クラスメソッドcountを呼ぶと現在のカウンタの値が返される。
したがって、このプログラムを端末上で実行すると、画面に3という数が表示されることになります。

まぁ、やってみた

実行してみると。12行目(最初のping)でエラー。

NoMethodError: undefined method `ping' for #<Robot:0x103cbbc>

インスタンス生成してpingしてる。
つまり、self(クラスメソッド)になってるから。
なので、selfを取ればいい。


次も、同じとこでエラー。

NameError: uninitialized class variable @@count in Robot

クラス変数が初期化されてないよ、なので最初に初期化してやる。
@@count = 0 を追加。


それから、次は、最後のputs Robot.count でエラー。

NoMethodError: undefined method `count' for Robot:Class

クラスメソッドじゃないから。
なので def self.count としてやる。

補足

関係ないけど、

class << self
  def hoge
  end
  def huga
  end
end

クラスメソッドってこういう書き方もあるんですね。
複数個書くなら、こっちの方がよさそうか。