2017-07-07 137 views
1

为什么对于此代码我有以下错误?Ruby扩展为对象类

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>' 

在什么类/ eigenclass奠定方法print在这种情况下?我怎样才能访问它?

回答

1

至于为什么你的错误调用的私有方法 - 有Kernel#printKernel包括在Object,因此默认对象有私人#print方法。


至于其中这些方法在于在这种情况下 - 这是单例类的上a类方法:

a.singleton_class.print 

至于如何模块延长a,检查@mudasobwa's answer


还要注意的是,即使你解决这个问题,你会得到一个错误调用#print与错误的参数数目,你重新定义它没有参数,但有一个调用它。要在覆盖该方法时调用原始实现,请使用super

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!"