Ruby子类中返回覆盖方法的数组
发布时间:2020-12-17 04:11:09 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 class Object def self.overridden_methods(parent_class = Object,within_tree = true) if within_tree defined_methods = ancestors[0..ancestors.i
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 class Object def self.overridden_methods(parent_class = Object,within_tree = true) if within_tree defined_methods = ancestors[0..ancestors.index(parent_class) - 1].map { |object| object.instance_methods(false) }.flatten.uniq parent_methods = superclass.instance_methods else defined_methods = instance_methods(false) parent_methods = parent_class.instance_methods end defined_methods & parent_methods end def overridden_methods(parent_class = Object,within_tree = true) self.class.overridden_methods(parent_class,within_tree) end def self.overrides?(method,parent_class = Object,within_tree = true) overridden_methods(parent_class,within_tree).include?(method.to_s) end def overrides?(method,within_tree = true) self.class.overrides?(method,parent_class,within_tree) end end class ParentModel < Object def save; end end class ChildModel < ParentModel def save; end def create; end def to_s; end end class AnotherChildModel < ParentModel def save; end end class GrandChildModel < ChildModel def create; end end # what have you overridden from the base `Object` class p ParentModel.overridden_methods(Object) #=> [] p ParentModel.overridden_methods(Object,false) #=> [] p ChildModel.overridden_methods(Object) #=> ["to_s","save"] p ChildModel.overridden_methods(Object,false) #=> ["to_s"] p ChildModel.overridden_methods(ParentModel) #=> ["to_s","save"] p ChildModel.overridden_methods(ParentModel,false) #=> ["to_s","save"] p AnotherChildModel.overridden_methods(Object) #=> ["save"] p AnotherChildModel.overridden_methods(Object,false) #=> [] p AnotherChildModel.overridden_methods(ParentModel) #=> ["save"] p AnotherChildModel.overridden_methods(ParentModel,false) #=> ["save"] p GrandChildModel.overridden_methods(Object) #=> ["create","to_s","save"] p GrandChildModel.overridden_methods(Object,false) #=> [] p GrandChildModel.overridden_methods(ParentModel) #=> ["create","save"] p GrandChildModel.overridden_methods(ParentModel,false) #=> [] p GrandChildModel.overridden_methods(ChildModel) #=> ["create"] p GrandChildModel.overridden_methods(ChildModel,false) #=> ["create"] 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |