Как проверить, определен ли частный метод в ruby

самое близкое, что я могу найти, это в Ruby, как проверить, определен ли метод " foo= ()"?, но он работает только в том случае, если метод является общедоступным, даже если он находится внутри блока класса.

что хочется:

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

2 ответов


другой способ-использовать :respond_to?, например,

self.respond_to?(:bar, true)

обратите внимание, что здесь важен второй параметр-он обозначает, что :respond_to? следует искать все методы области, включая частные методы.


вы хотите Module#private_method_defined?.

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