2010-09-11 12 views
12

Aşağıdaki gibi bir sınıfım varsa, ataların bir sınıfla bir modül arasında ne zaman olduğunu nasıl anlarım?Ata'nın Ruby'de bir Sınıf mı yoksa Modül mi olduğunu anlatma yöntemi?

Böyle bir şey yapabilmek istiyorum

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" 
] 
: Bir nesne olup olmadığı aşağı kaynar

SubGroup.ancestor_classes #=> only the classes in the tree 
SubGroup.ancestor_modules #=> only the modules in the tree 

ancestor_names.each do |name| 
    if class?(name) 
    puts "#{name} is a Class" 
    elsif module?(name) 
    puts "#{name} is a Module" 
    end 
end 

ya ..., nasıl kontrol edebilirim Bir sınıf mı yoksa modül mü?

cevap

13

Eh, bu included_modules yani ne muhtemelen aradığınız olduğunu için budur:

: Bir yardımcı yöntemiyle,

SubGroup.included_modules      #=> module ancestors 
SubGroup.ancestors - SubGroup.included_modules #=> class ancestors 

Ya

class Class 
    def ancestor_classes 
    ancestors - included_modules 
    end 
end 

SubGroup.included_modules #=> module ancestors 
SubGroup.ancestor_classes #=> class ancestors 
10

Kullanım Object#instance_of?:

Object.instance_of? Class # => true 
Object.instance_of? Module # => false 
Kernel.instance_of? Class # => false 
Kernel.instance_of? Module # => true 
İlgili konular