2010-09-23 12 views

Odpowiedz

30
Test.instance_eval { private :private_method } 

Albo po prostu uruchomić

private :private_method 

od wewnątrz klasy Test.

+0

że było łatwo, dziękuję ! :RE – knoopx

7

Module#private pobiera opcjonalny argument o nazwie metody:

class Test 
private :private_method 
end 

Powyższe ekwiwalentu oczywiście

Test.private :private_method # doesn't work 

Poza tym Module#private jest prywatny, więc trzeba użyć refleksji obejście ograniczenia dostępu:

Test.send :private, :private_method 

Niezbędne jest nr eval.

8

Wydaje się, że wychodząc z Ruby 2.1, define_method szanuje 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! 

(zdaję sobie sprawę, że jest to stare pytanie, ale zdarzyło mi się po niej przez Google).

Powiązane problemy