Как динамически определить метод как частный? - PullRequest
11 голосов
/ 23 сентября 2010

Это не похоже на работу:

class Test
  private

  define_method :private_method do 
    "uh!"
  end
end

puts Test.new.private_method

Ответы [ 3 ]

33 голосов
/ 23 сентября 2010
Test.instance_eval { private :private_method }

Или просто запустите

private :private_method

из класса Test.

10 голосов
/ 16 мая 2014

Кажется, что начиная с 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.)

7 голосов
/ 24 сентября 2010

Module#private принимает необязательный аргумент для имени метода:

class Test
 private :private_method
end

Вышесказанное, конечно, эквивалентно

Test.private :private_method # doesn't work

За исключением того, что Module#private является частным, так что вынеобходимо использовать отражение, чтобы обойти ограничения доступа:

Test.send :private, :private_method

Нет eval необходимо.

...