2010-09-23 5 views

Répondre

30
Test.instance_eval { private :private_method } 

Ou, il suffit d'exécuter

private :private_method 

à partir de la classe Test.

+0

qui était facile, merci ! :RÉ – knoopx

7

Module#private prend un argument optionnel pour le nom de la méthode:

class Test 
private :private_method 
end 

Ce qui précède est bien sûr équivalent à

Test.private :private_method # doesn't work 

Sauf que Module#private est privé, donc vous devez utiliser la réflexion pour contourner la restrictions d'accès:

Test.send :private, :private_method 

Non eval nécessaire.

8

Il semble qu'à partir de Ruby 2.1, define_method respecte private:

$ rvm 2.1.0 
$ ruby /tmp/test.rb 
/tmp/test.rb:10:in `<main>': private method `private_method' called for #<Test:0x00000102014598> (NoMethodError) 
$ rvm 2.0 
$ ruby /tmp/test.rb 
uh! 

(Je sais que c'est une vieille question, mais je suis tombé sur via Google.)

Questions connexes