寻找有趣的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;”这样的东西不是与“:之间?”相同意义上的方法??
答案 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/