微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

告诉祖先是Ruby中的Class还是Module的方法?

如果我有一个像下面这样的类,那我怎么知道一个祖先是一个类,一个模块呢?
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 举报,一经查实,本站将立刻删除。

相关推荐