2017-07-07 6 views
1

Warum für diesen Code habe ich folgenden Fehler?Ruby erweitern für Objektklasse

module ForExtend 
    def print 
    print "ForExtend print method!" 
    end 
end 

class A 
end 

a = A.new 

class << a 
    extend ForExtend 
end 

a.print 

Ergebnis:

private method `print' called for #<A:0x005607b26811f8> 
(repl):16:in `<main>' 

In welcher Klasse/Eigenklasse Methode print in diesem Fall legt? Und wie kann ich darauf zugreifen?

Antwort

1

Was, warum Sie den Fehler für eine private Methode aufrufe - es Kernel#print und Kernel ist in Object enthält, daher standardmäßig Objekte eine eigene #print Methode hat.


Was, wo diese Methode liegt in diesem Fall - es ist eine Klassenmethode der Singleton-Klasse auf a:

a.singleton_class.print 

Was, wie das Modul für a zu erweitern, überprüft @mudasobwa's answer .


Beachten Sie auch, dass selbst wenn Sie dieses Problem zu beheben, werden Sie eine Fehlermeldung erhalten für #print mit falschen Anzahl von Argumenten aufrufen, wie Sie es neu definiert keine Argumente zu nehmen, aber es mit einem Anruf. Um die ursprüngliche Implementierung beim Überschreiben der Methode aufzurufen, verwenden Sie super.

1

Es ist, weil Sie A Klasse haben, nicht ihre Instanz a, erweitert.

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