Ruby中包含vs. extend和Comparable模块

时间:2013-04-22 13:44:54

标签: ruby-on-rails-3

寻找有趣的Ruby观察的解释。考虑在Comparable模块中混合如下:

class Class0
end
class Class1
  include Comparable
end
class Class2
  extend Comparable
end

如果我们寻找Class2与Class0中的方法,

Class2.methods.each { |x| p x if not Class0.methods.include? x }

我们得到:介于两者之间?

但是,如果我们这样做,要查找Class1和Class0实例之间的区别,

a = Class0.new
b = Class1.new
b.methods.each { |x| p x if not a.methods.include? x }

我们得到了

[:>, :>=, :<, :<=, :between?]

我想了解结果不同的原因。我本来期望“扩展”将相同的方法推送到“include”推入实例的类中。 像“:&gt;”这样的东西不是与“:之间?”相同意义上的方法??

1 个答案:

答案 0 :(得分:3)

Include用于向类的实例添加方法,而extend用于添加类方法: http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/

两者:&gt;和:之间是方法。 区别在于:

如果你看到Class0方法,你有:&gt;,:&gt; =,:&lt;,:&lt; =定义为类方法。 当Class2扩展Comparable时,它会介于两者之间吗?方法作为类方法。

在第二种情况下,您有Class0和Class1实例,因此Class0的实例没有:&gt;,:&gt; =,:&lt;,:&lt; =,:between?定义为实例方法的方法。一旦你在Class1中包含了类似的Module,它将把所有这些方法作为Module的实例方法,所以你将拥有所有[:&gt;,:&gt; =,:&lt;,:&lt; =,:between?]方法在实例b中可用。

这就是你得到这些结果的原因。

我发现另外一个很好的解释包括VS extend: http://aaronlasseigne.com/2012/01/17/explaining-include-and-extend/