【问题标题】:How to check if private method is defined in ruby如何检查是否在 ruby​​ 中定义了私有方法
【发布时间】:2015-11-19 21:23:39
【问题描述】:

我能找到的最接近的是In Ruby, how do I check if method "foo=()" is defined?,但它只有在方法是公共的情况下才有效,即使在类块中也是如此。

我想要什么:

class Foo
  private

  def bar
    "bar"
  end

  magic_private_method_defined_test_method :bar #=> true
end

我尝试过的:

class Foo
  private

  def bar
    "bar"
  end

  respond_to? :bar #=> false
  #this actually calls respond_to on the class, and so respond_to :superclass gives true
  defined? :bar #=> nil
  instance_methods.include?(:bar) #=> false
  methods.include?(:bar) #=> false
  method_defined?(:bar) #=> false
  def bar
    "redefined!"
  end # redefining doesn't cause an error or anything

  public
  def bar
    "redefined publicly!"
  end #causes no error, behaves no differently whether or not #bar had been defined previously
end

【问题讨论】:

  • 旁注:我实际上想知道这一点,并在编写问题的过程中发现了答案。在这里发布,因为我无法轻易找到我的答案,所以我希望下一个家伙能够。

标签: ruby class


【解决方案1】:

另一种方式是使用:respond_to?,例如

self.respond_to?(:bar, true)

请注意,这里的第二个参数很重要——它表示:respond_to? 应该查找所有作用域方法,包括私有方法。

【讨论】:

    【解决方案2】:

    你想要Module#@987654321@

    class Foo
      def do_stuff_if_bar_is_defined
        if self.class.private_method_defined?(:bar)
          do_stuff
        end
      end
    
      private
    
      def bar
        "bar"
      end
    
      private_method_defined? :bar #=> true
    end
    Foo.private_method_defined? :bar #=> true
    

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      相关资源
      最近更新 更多