【问题标题】:What is the relationship between Array and Enumerable?Array和Enumerable有什么关系?
【发布时间】:2015-01-05 22:52:22
【问题描述】:

Array 没有sort_by; Enumerable 有。这是如何工作的?

%w[aa aaaa aaa].sort_by{|item| item.length} #=> ['aa','aaa','aaaa']

这不是必须抛出undefined method sort_by之类的错误吗? Array和Enumerable是什么关系?

【问题讨论】:

  • 数组包含可枚举
  • 感觉这应该是某物的复制品,但如果是的话,我就找不到了。所以,+1。
  • 我给earlier question 留下了评论,该评论对Enumerable 模块是如何产生的提供了合理的解释。
  • @apneadiving,一个小问题:大多数读者会理解你所说的是“类数组包含语句'包含枚举'”的简写,但我认为“类数组混合在 Enumerable 模块中" 更清晰。

标签: ruby arrays


【解决方案1】:

Array 类包括Enumerable 模块。您可以在左侧“包含的模块”下的文档中看到这一点。

【讨论】:

    【解决方案2】:

    Enumerable 混入Array 类:Enumerable 定义的所有方法都可用于 Ruby 数组。

    Array.ancestors # => [Array, Enumerable, Object, Kernel, BasicObject]

    【讨论】:

      【解决方案3】:

      这称为继承。如果在对象的类中找不到方法,Ruby 会沿着祖先链向上走,直到找到它。

      Array 继承自 Enumerable(更准确地说,它混入 Enumerable,这是一种继承形式)。

      【讨论】:

      • 不过,在这种情况下不涉及继承。这只是对混合模块的简单方法委托(在这种情况下为 Enumerable)
      • @HectorCorrea:这里没有委托。 Array 不委托给Enumerable 的(一个实例),它继承自它(更准确地说:它混合它,这是一种继承形式,其中混合的“类”不知道它的超类,直到它混在一起)。
      • @Hector,如果是这样的话,Array 类中的 take_while 之类的方法将毫无意义,Enumerable 也提供了这些方法。由于Enumerable 方法服务于多个集合类,因此在某些情况下,它们的效率不如为特定类定制的相同方法。正是出于这个原因,您会看到许多集合类的方法与Enumerable 方法同名。
      • @CarySwoveland 我从未质疑过 mixins 的价值。我的意思是警告继承和混合是两个不同的东西。
      • Hector,我想到除了提高效率之外,还有其他原因可以在集合类中提供方法,这些方法在混入的Enumerable 模块中有对应项。下面是给出不同结果的方法示例:(0.0..1.0).include?(0.5) #=> true; Range.send(:remove_method, :include?); (0.0..1.0).include?(0.5) #=> TypeError: can't iterate from Float。这里Range#include? 等价于Range#cover 当端点是数字时,而Enumerable#include? 不是。
      猜你喜欢
      • 1970-01-01
      • 2012-04-01
      • 2015-06-19
      • 2015-11-21
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多