Как проверить, определен ли частный метод в 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