erlswf является проектом с открытым исходным кодом, записанным в erlang для декомпиляции .swf файлы.
Вот сайт: https://github.com/bef/erlswf
Если вы используете 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
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"]
вы всегда можете перейти к следующему и посмотреть, определено ли оно там:
a = A.new
a.methods.include?(:method)
Дан объект b
, который является экземпляром B
, вы можете проверить, есть ли у непосредственного суперкласса b
a_method
:
b.class.superclass.instance_methods.include? 'a_method'
Обратите внимание, что тест проводится против имени метода, а не символа или объекта метода .
«таким образом, не переопределяется в B» - Просто знать, что метод определен только в A, сложно, потому что вы можете определить метод для отдельных экземпляров A и B ... поэтому я думаю, что это будет было бы сложно проверить, что a_method определен только на A, потому что вам придется округлить все подклассы и субэкземпляры в системе и протестировать их ...