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?]

我想了解为什么结果不同。我本来希望“扩展”将相同的方法推送到“包含”推送到实例中的类中。像“:>”这样的东西不是和“:between”一样的方法吗???

4

1 回答 1

3

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

:> 和 :between 都是方法。区别就在这里:

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

在第二种情况下,您有 Class0 和 Class1 实例,因此 Class0 的实例没有 :>, :>=, :<, :<=, :between? 方法定义为实例方法。一旦您在 Class1 中包含了可比较的 Module,它将从 Module 中获取所有这些方法作为实例方法,因此您将拥有所有 [:>, :>=, :<, :<=, :between?] 方法在实例中可用湾。

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

我在这里找到了另一个很好的包含 VS 扩展的解释:http: //aaronlasseigne.com/2012/01/17/explaining-include-and-extend/

于 2013-04-22T17:14:56.913 回答