为什么这段代码我有以下错误?
module ForExtend
def print
print "ForExtend print method!"
end
end
class A
end
a = A.new
class << a
extend ForExtend
end
a.print
结果:
private method `print' called for #<A:0x005607b26811f8>
(repl):16:in `<main>'
在这种情况下,什么类/特征类放置方法print
?我该如何访问它?
答案 0 :(得分:1)
这是因为你有A
个课程,而不是他们的实例a
。
module ForExtend
def print
puts "ForExtend print method!"
end
end
class A; end
a = A.new
a.extend ForExtend # ⇐ THIS WILL EXTEND a
a.print
#⇒ "ForExtend print method!"
答案 1 :(得分:1)
至于为什么你收到调用私有方法的错误 - Kernel#print
中包含Kernel
和Object
,因此默认情况下对象具有私有#print
方法
至于这种方法在这种情况下的位置 - 它是a
上单例类的类方法:
a.singleton_class.print
至于如何扩展a
的模块,请检查@mudasobwa's answer。
另请注意,即使您解决了这个问题,在重新定义参数时也会因错误数量的参数调用#print
而导致错误,因为您重新定义了参数,而不是参数。要在覆盖方法时调用原始实现,请使用super
。