执行下面的程序的话便发生了错误。请将程序进行修改以能正确运行。
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。
--
黒田努
解答与说明的显示・隐藏
解答与说明
这次完全不存在让人感到棘手的地方。实际上只要运行Ruby解释器进行修改的话,就可在比较短的时间内解决问题。
但是如果让你只用铅笔和纸来解决问题的话又怎么样呢。
我想正确率一定很低。
从寄来解答的诸君那里,也听到了“这次算是又学习了”的感慨。
***
先简单的温习一下类变量与类方法吧。
类变量在名称的前面添加 @@ 符号表示。定义了此项的类,便成为被子变量、实例所共有的变量。不能从除此之外的对象查看。
类方法是类提供的“方便的的函数(功能)”。与实例方法查看、改变类的状态相对照。类方法也可以从类的外部进行利用。
***
于是很快能发现的是,类方法与实例方法的定义是相反的。类方法名称的前面可以添加self. 。但是实例方法名称的前面不可以。
class Robot
def ping
@@count += 1
end
def self.count
@@count
end
end
但是,只修改两处的的方法定义的话显然不够。试着运行的话便会出现下面的错误信息。
robot.rb:3:in `ping': uninitialized class variable @@count in Robot (NameError)
类变量的 @@count 未被定义。
应该在哪里执行类变量的初始化呢。
下面的代码是笔名为 y@su 的先生写的对 Robot 类的定义。
class Robot
def initialize
@@count ||= 0
end
def ping
@@count += 1
end
def self.count
@@count
end
end
这也能运行,但是构造函数 initialize 方法的作用是,将 Robot 实例初始化。在将类变量初始化的情况下不是那么适合。
类变量在类定义中初始化。
下面是示范解答。
class Robot
@@count = 0
def ping
@@count += 1
end
def self.count
@@count
end
end
r1 = Robot.new
r1.ping
r2 = Robot.new
r2.ping
r1.ping
puts Robot.count
大詰君、MTG君、river125君的代码,与示范解答完全一样,在此感谢。