2012-08-24 8 views
11

Bir nesne ve bir modül verildiğinde, nesnenin modül tarafından genişletildiğini nasıl kontrol edebilirim?Bir örneğin bir Ruby modülüyle genişletilip genişletilmediğini nasıl belirlenir?

İlgili bir uzantı yok gibi görünüyor mu? uzanan bir (-

o.singleton_class < Foobar 

onun tekil yöntemlerden bütün yaşadığımız Bir nesnenin tekil sınıftır: yöntem

moirb(main):001:0> module Foobar 
irb(main):002:1> end 
=> nil 
irb(main):003:0> o=Object.new 
=> #<Object:0x000001010d1400> 
irb(main):004:0> o.class.include? Foobar 
=> false 
irb(main):005:0> o.extend Foobar 
=> #<Object:0x000001010d1400> 
irb(main):006:0> o.class.include? Foobar 
=> false 
irb(main):007:0> o.class.included_modules 
=> [PP::ObjectMixin, Kernel] 
irb(main):016:0* o.methods.grep /extend/ 
=> [:extend] 
irb(main):019:0> o.class.methods.grep /extend/ 
=> [:extend] 
+0

Aynı kelime olan 'include' ve' include? 'Hakkında hiçbir zaman düşünmedik ama daha önce farklı anlamlar. –

cevap

14

üzerinde sınıf yöntemleri gibi Bar'a yöntemleri (yani Tekil yöntemler) ekleyin Bu nedenle, sadece is_a? kullanmadığınız herhangi bir neden var mı geçerli:

o.is_a? Foobar 
# => true 
+1

Bunun işe yaramadığını biliyor muydun? ;) –

9

Eğer gerçekten özlü olmak istiyorsanız

o.singleton_class.included_modules 

kullanmak Veya edebilirsiniz Anladığım kadarıyla) tekil sınıfına dahil olmaya eşdeğerdir.

class Foo 
    extend Bar 
end 

ve

class Foo 
    class << self 
    include Bar 
    end 
end 

İkisi Foo

İlgili konular