ruby中特定类方法的已定义超级方法列表
我正在处理一个具有复杂类/混合层次结构的系统。由于有许多层分散在许多不同的文件上,我想快速了解给定方法的超级调用链是什么 比如说ruby中特定类方法的已定义超级方法列表,ruby,inheritance,reflection,mixins,super,Ruby,Inheritance,Reflection,Mixins,Super,我正在处理一个具有复杂类/混合层次结构的系统。由于有许多层分散在许多不同的文件上,我想快速了解给定方法的超级调用链是什么 比如说 module AAA def to_s "AAA " + super() end end module BBB def to_s "BBB " + super() end end class MyArray < Array include AAA include BBB def to_s "MyArray
module AAA
def to_s
"AAA " + super()
end
end
module BBB
def to_s
"BBB " + super()
end
end
class MyArray < Array
include AAA
include BBB
def to_s
"MyArray " + super()
end
end
> MyArray.new.to_s
=> "MyArray BBB AAA []"
> method_supers(MyArray,:to_s)
=> ["MyArray#to_s", "BBB#to_s", "AAA#to_s", "Array#to_s", ...]
模块AAA
def至美国
“AAA”+超级()
结束
结束
模块BBB
def至美国
“BBB”+超级()
结束
结束
类MyArrayMyArray.new.to_
=>“MyArray BBB AAA[]”
>方法超级(MyArray,:to)
=>[“MyArray#to#s”、“BBB#to#s”、“AAA#to#s”、“Array#to#s”、…]
也许是这样的
class A
def foo; p :A; end
end
module B
def foo; p :B; super; end
end
module C; end
class D < A
include B, C
def foo; p :D; super; end
end
p D.ancestors.keep_if { |c| c.instance_methods.include? :foo } # [D, B, A]
也许是这样的
class A
def foo; p :A; end
end
module B
def foo; p :B; super; end
end
module C; end
class D < A
include B, C
def foo; p :D; super; end
end
p D.ancestors.keep_if { |c| c.instance_methods.include? :foo } # [D, B, A]
如果有人想到一个更好的标题,让我知道。如果有人想到一个更好的标题,让我知道。你的代码是可以改进的,那么为什么你不把它放在问题本身,要求这里的人对你的代码进行其他选择或改进。因为这是一个答案。没有任何东西可以阻止人们发布另一个或评论以提出改进建议。你为什么不提出改进建议?@OMG我认为如果有一个网站,你可以提交代码,让业内人士对其进行审查,并通过评论和告诉你他们将如何以不同的方式处理问题来帮助你改进,那将是一件非常酷的事,对它进行优化,甚至是针对特定语言的更标准化的方法,因为当我第一次开始学习ruby时,我试图纠正for循环而不是.each循环。@ratelle我同意这是一个答案,也是帮助其他人的起点,它不一定是你编写过的最好的东西。你的代码可以改进,那么为什么你不把它放在问题本身,要求这里的人对你的代码进行其他选择或改进。因为这是一个答案。没有任何东西可以阻止人们发布另一个或评论以提出改进建议。你为什么不提出改进建议?@OMG我认为如果有一个网站,你可以提交代码,让业内人士对其进行审查,并通过评论和告诉你他们将如何以不同的方式处理问题来帮助你改进,那将是一件非常酷的事,对它进行优化,甚至只是针对特定语言采用更标准化的方法,因为当我第一次开始学习ruby时,我试图纠正for循环而不是.each循环。@ratelle我同意这是一个答案,也是帮助他人的起点,它不一定是你写过的最好的东西
def Object.super_methods(method)
ancestors.keep_if { |c| c.instance_methods.include? method }
end
p D.super_methods(:foo) # [D, B, A]