所以我有三种不同的方法可以在模块上使用类级方法:
如果我有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遵循的是类级别。
我试图想到一些形式有效的边缘情况,但另一种形式没有。有没有?
答案 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