How do I dynamically define a method as private?

后端 未结 3 855
刺人心
刺人心 2021-01-04 08:52

This does not seem to work:

class Test
  private

  define_method :private_method do 
    \"uh!\"
  end
end

puts Test.new.private_method
相关标签:
3条回答
  • 2021-01-04 09:34
    Test.instance_eval { private :private_method }
    

    Or, just run

    private :private_method
    

    from within the Test class.

    0 讨论(0)
  • 2021-01-04 09:36

    Module#private takes an optional argument for the method name:

    class Test
     private :private_method
    end
    

    The above is of course equivalent to

    Test.private :private_method # doesn't work
    

    Except that Module#private is private, so you have to use reflection to circumvent the access restrictions:

    Test.send :private, :private_method
    

    No eval necessary.

    0 讨论(0)
  • 2021-01-04 09:41

    It seems that starting with Ruby 2.1, define_method respects 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!
    

    (I realize this is an old question, but I happened across it via Google.)

    0 讨论(0)
提交回复
热议问题