All*_*ate 12 ruby module extend
给定一个对象和一个模块,如何检查该对象是否已被模块扩展?
似乎没有任何相应的延伸?方法
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]
Run Code Online (Sandbox Code Playgroud)
Jör*_*tag 16
您有没有理由不仅仅使用is_a?:
o.is_a? Foobar
# => true
Run Code Online (Sandbox Code Playgroud)
您可以使用
o.singleton_class.included_modules
Run Code Online (Sandbox Code Playgroud)
或者如果你想要真正精辟:
o.singleton_class < Foobar
Run Code Online (Sandbox Code Playgroud)
对象的单例类是其所有单例方法所在的位置 - 扩展是(据我所知)等效于包含到单例类中.这就是为什么
class Foo
extend Bar
end
Run Code Online (Sandbox Code Playgroud)
和
class Foo
class << self
include Bar
end
end
Run Code Online (Sandbox Code Playgroud)
两者都将Bar中的方法添加为类方法(即单例方法) Foo
| 归档时间: |
|
| 查看次数: |
2710 次 |
| 最近记录: |