2017-07-07 84 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!"