Обнаружение, что метод не был переопределен

erlswf является проектом с открытым исходным кодом, записанным в erlang для декомпиляции .swf файлы.

Вот сайт: https://github.com/bef/erlswf

6
задан mxgrn 9 November 2009 в 17:15
поделиться

4 ответа

Если вы используете Ruby 1.8.7 или выше, это легко сделать с помощью Method # owner / UnboundMethod # owner .

class Module
  def implements_instance_method(method_name)
    instance_method(method_name).owner == self
    rescue NameError
    false
  end
end
7
ответ дан 10 December 2019 в 02:49
поделиться
class A
  def m1; end
  def m2; end
end

class B < A
  def m1; end
  def m3; end
end

obj = B.new
methods_in_class = obj.class.instance_methods(false)  # => ["m1", "m3"]
methods_in_superclass = obj.class.superclass.instance_methods(false)  # => ["m2", "m1"]
methods_in_superclass - methods_in_class  # => ["m2"]
2
ответ дан 10 December 2019 в 02:49
поделиться

вы всегда можете перейти к следующему и посмотреть, определено ли оно там:

a = A.new

a.methods.include?(:method)
0
ответ дан 10 December 2019 в 02:49
поделиться

Дан объект b , который является экземпляром B , вы можете проверить, есть ли у непосредственного суперкласса b a_method :

b.class.superclass.instance_methods.include? 'a_method'

Обратите внимание, что тест проводится против имени метода, а не символа или объекта метода .

«таким образом, не переопределяется в B» - Просто знать, что метод определен только в A, сложно, потому что вы можете определить метод для отдельных экземпляров A и B ... поэтому я думаю, что это будет было бы сложно проверить, что a_method определен только на A, потому что вам придется округлить все подклассы и субэкземпляры в системе и протестировать их ...

0
ответ дан 10 December 2019 в 02:49
поделиться