gpt4 book ai didi

ruby-on-rails-3 - 在 Ruby 中包含与扩展和比较模块

转载 作者:行者123 更新时间:2023-12-04 07:19:50 24 4
gpt4 key购买 nike

寻找一个有趣的 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 }

我们得到 :between?

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

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

我们得到

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

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

最佳答案

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

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

如果你看到 Class0 方法,你有 :>, :>=, :<, :<= 定义为类方法。当 Class2 扩展 Comparable 时,它​​会得到 between 吗?方法作为类方法。

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

这就是您获得这些结果的原因。

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

关于ruby-on-rails-3 - 在 Ruby 中包含与扩展和比较模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16148699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com