如果我有一个像下面这样的类,那我怎么知道一个祖先是一个类,一个模块呢?
ActiveRecord::Base.send(:include,SomeLibrary) class Group < ActiveRecord::Base include SomeLibrary::Core end class SubGroup < Group end ancestor_names = SubGroup.ancestors.map(&:name) puts ancestor_names.inspect #=> [ "SubGroup","SomeLibrary::Core::InstanceMethods","SomeLibrary::Core","Group","ActiveRecord::Base","SomeLibrary","ActiveRecord::Aggregations","ActiveRecord::Transactions","ActiveRecord::Reflection","ActiveRecord::Batches","ActiveRecord::Calculations","ActiveRecord::Serialization","ActiveRecord::AutosaveAssociation","ActiveRecord::nestedAttributes","ActiveRecord::Associations","ActiveRecord::AssociationPreload","ActiveRecord::NamedScope","ActiveRecord::Callbacks","ActiveRecord::Observing","ActiveRecord::Timestamp","ActiveRecord::Dirty","ActiveRecord::AttributeMethods","ActiveRecord::Locking::Optimistic","ActiveRecord::Locking::pessimistic","ActiveSupport::Callbacks","ActiveRecord::Validations","Object","Mocha::ObjectMethods","JSON::Pure::Generator::GeneratorMethods::Object","ActiveSupport::Dependencies::Loadable","Base64::Deprecated","Base64","PP::ObjectMixin","Kernel" ]
我想要做这样的事情:
ancestor_names.each do |name| if class?(name) puts "#{name} is a Class" elsif module?(name) puts "#{name} is a Module" end end
要么…
SubGroup.ancestor_classes #=> only the classes in the tree SubGroup.ancestor_modules #=> only the modules in the tree
解决方法
那么这就是
included_modules
的,所以你可能正在寻找的是:
SubGroup.included_modules #=> module ancestors SubGroup.ancestors - SubGroup.included_modules #=> class ancestors
或者,使用辅助方法:
class Class def ancestor_classes ancestors - included_modules end end SubGroup.included_modules #=> module ancestors SubGroup.ancestor_classes #=> class ancestors
原文地址:https://www.jb51.cc/ruby/271901.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。