Jak dynamicznie zdefiniować metodę jako prywatną?


To nie wydaje się działać:
class Test
private define_method :private_method do
"uh!"
end
endputs Test.new.private_method

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Test.instance_eval { private :private_method }

Lub po prostu bieganie
private :private_method

z klasy
Test
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wygląda na to, że w Ruby 2.1 relacja
define_method
jest
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 to stare pytanie, ale przypadkiem natknąłem się na nie za pośrednictwem Google).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Module # private
przyjmuje opcjonalny argument dla nazwy metody:
class Test
private :private_method
end

Powyższe jest oczywiście równoważne z
Test.private :private_method # doesn't work

Tyle że
Module # private
jest prywatny, więc musisz użyć odbicia, aby obejść ograniczenia dostępu:
Test.send :private, :private_method

Nie potrzeba
eval
.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się