代码之家  ›  专栏  ›  技术社区  ›  knoopx

如何将方法动态定义为private?

  •  11
  • knoopx  · 技术社区  · 16 年前

    这似乎不起作用:

    class Test
      private
    
      define_method :private_method do 
        "uh!"
      end
    end
    
    puts Test.new.private_method
    
    3 回复  |  直到 14 年前
        1
  •  34
  •   Brian Campbell Dennis Williamson    16 年前
    Test.instance_eval { private :private_method }
    

    或者,快跑

    private :private_method
    

    Test 班级。

        2
  •  10
  •   Henrik N    12 年前

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

    (我意识到这是一个老问题,但我碰巧通过谷歌发现了这个问题。)

        3
  •  7
  •   Jörg W Mittag    16 年前

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

    class Test
     private :private_method
    end
    

    以上当然等同于

    Test.private :private_method # doesn't work
    

    除了那个 是私有的,因此必须使用反射来绕过访问限制:

    Test.send :private, :private_method
    

    eval 必要的。

    推荐文章