12

这似乎不起作用:

class Test
  private

  define_method :private_method do 
    "uh!"
  end
end

puts Test.new.private_method
4

3 回答 3

35
Test.instance_eval { private :private_method }

或者,只是运行

private :private_method

Test班内。

于 2010-09-23T19:57:10.893 回答
10

似乎从 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!

(我意识到这是一个老问题,但我是通过谷歌偶然发现的。)

于 2014-05-16T17:17:32.913 回答
7

Module#private采用方法名称的可选参数:

class Test
 private :private_method
end

以上当然等价于

Test.private :private_method # doesn't work

除了Module#private是私有的,所以你必须使用反射来规避访问限制:

Test.send :private, :private_method

没有eval必要。

于 2010-09-23T21:12:29.703 回答