2012-08-24 27 views
11

Cho một đối tượng và một mô-đun, làm cách nào để kiểm tra xem đối tượng đã được mô-đun mở rộng chưa?Làm thế nào để xác định xem một cá thể đã được mở rộng bởi một mô-đun Ruby?

Dường như không có bất kỳ phần mở rộng tương ứng nào? phương pháp

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

Không bao giờ nghĩ về 'bao gồm' và' bao gồm? 'Có cùng một từ nhưng ý nghĩa khác nhau trước đây. –

Trả lời

14

Có bất kỳ lý do tại sao bạn không chỉ sử dụng is_a?:

o.is_a? Foobar 
# => true 
+1

Bên cạnh thực tế tôi không biết điều đó có hiệu quả không? ;) –

9

Bạn có thể sử dụng

o.singleton_class.included_modules 

Hoặc nếu bạn muốn được thực sự súc tích:

o.singleton_class < Foobar 

lớp singleton An đối tượng là nơi mà tất cả các phương pháp singleton nó sống - mở rộng là (theo như tôi hiểu) tương đương với việc đưa vào lớp singleton. Đây là lý do tại sao

class Foo 
    extend Bar 
end 

class Foo 
    class << self 
    include Bar 
    end 
end 

Cả thêm các phương thức từ Bar như các phương pháp lớp học (ví dụ singleton phương pháp) trên Foo

Các vấn đề liên quan