Ruby:这些自我扩展的区别是什么?

时间:2015-06-22 18:21:20

标签: ruby module extend self

所以我有三种不同的方法可以在模块上使用类级方法:

如果我有3个或更少,我通常会这样做:

module Foo
  def self.speak
    "Foo"
  end
end

如果我有更多,我传统上这样做:

module Bar
  class << self
    def speak
      "Bar"
    end
  end
end

但是最近,我遇到了这种非常好的方式,并且更频繁地开始使用它:

module FooBar
  extend self 

  def speak
    "FooBar"
  end
end

他们都工作:

Foo.speak => "Foo"
Bar.speak => "Bar"
FooBar.speak => "FooBar"

那么,是否存在任何重大差异或问题需要注意,尤其是用最后一个表格?我能想到的唯一真正的问题是,一旦你“扩展自我”,所有方法defs遵循的是类级别。

我试图想到一些形式有效的边缘情况,但另一种形式没有。有没有?

1 个答案:

答案 0 :(得分:3)

第三种形式与前两种形式不同,它创建了一个实例方法:speak和一个模块方法:speak

module Foo
  def self.speak
    "Foo"
  end
end
Foo.methods.include?(:speak)             #=> true
Foo.instance_methods.include?(:speak)    #=> false

class A
  include FooBar
end
A.instance_methods.include?(:speak)      #=> false

module Bar
  class << self
    def speak
      "Bar"
    end
  end
end
Bar.methods.include?(:speak)             #=> true
Bar.instance_methods.include?(:speak)    #=> false

class A
  include Bar
end
A.instance_methods.include?(:speak)      #=> false

module FooBar
  extend self 
  def speak
    "FooBar"
  end
end

FooBar.methods.include?(:speak)          #=> true
FooBar.instance_methods.include?(:speak) #=> true

class A
  include FooBar
end

A.instance_methods.include?(:speak)      #=> true