2017-07-07 5 views
1

Pourquoi ce code j'ai une erreur suivante?Ruby étendre pour la classe d'objet

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

class A 
end 

a = A.new 

class << a 
    extend ForExtend 
end 

a.print 

Résultat:

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

Dans quelle classe/eigenclass définit la méthode print dans ce cas? Et comment puis-je y accéder?

Répondre

1

Quant à savoir pourquoi vous obtenez l'erreur d'appeler une méthode privée - il y a Kernel#print et Kernel est inclus dans Object, les objets donc par défaut ont une méthode #print privée.


Quant à savoir où cette méthode est dans ce cas - il est une méthode de classe de la classe singleton sur a:

a.singleton_class.print 

Quant à la façon d'étendre le module pour a, vérifier @mudasobwa's answer .


Notez également que même si vous résoudre cela, vous obtiendrez une erreur pour appeler #print avec mauvais nombre d'arguments que vous redéfinissez pour prendre aucun argument, mais l'appeler avec un. Pour appeler l'implémentation d'origine lors de l'écrasement de la méthode, utilisez super.

1

C'est parce que vous avez la classe A, pas leur instance a, étendue.

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