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