Ответ 1
Test.instance_eval { private :private_method }
Или просто запустите
private :private_method
из класса Test
.
Это не работает:
class Test
private
define_method :private_method do
"uh!"
end
end
puts Test.new.private_method
Test.instance_eval { private :private_method }
Или просто запустите
private :private_method
из класса Test
.
Кажется, что начиная с Ruby 2.1, define_method
соответствует 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!
(Я понимаю, что это старый вопрос, но я прошел через него через Google.)
Module#private
принимает необязательный аргумент для имени метода:
class Test
private :private_method
end
Выше, конечно, эквивалентно
Test.private :private_method # doesn't work
За исключением того, что Module#private
является закрытым, вы должны использовать отражение, чтобы обойти ограничения доступа:
Test.send :private, :private_method
Нет eval
.