如何将方法动态定义为私有?

kno*_*opx 12 ruby methods metaprogramming access-specifier

这似乎不起作用:

class Test
  private

  define_method :private_method do 
    "uh!"
  end
end

puts Test.new.private_method
Run Code Online (Sandbox Code Playgroud)

Bri*_*ell 34

Test.instance_eval { private :private_method }
Run Code Online (Sandbox Code Playgroud)

或者,跑吧

private :private_method
Run Code Online (Sandbox Code Playgroud)

来自Test班上.


Hen*_*k N 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!
Run Code Online (Sandbox Code Playgroud)

(我意识到这是一个老问题,但我通过谷歌发生了它.)


Jör*_*tag 7

Module#private 获取方法名称的可选参数:

class Test
 private :private_method
end
Run Code Online (Sandbox Code Playgroud)

以上当然等同于

Test.private :private_method # doesn't work
Run Code Online (Sandbox Code Playgroud)

除非Module#private是私有的,因此您必须使用反射来规避访问限制:

Test.send :private, :private_method
Run Code Online (Sandbox Code Playgroud)

eval必要.