Ruby Module可以访问它所需的类方法吗?

时间:2017-06-17 17:31:06

标签: ruby class inheritance methods module

我不太明白这是如何运作的:

module Perimeter
  def perimeter
    sides.inject(0) { |sum, side| sum + side }
  end
end

class Rectangle
  include Perimeter

  def initialize(length, breadth)
    @length = length
    @breadth = breadth
  end

  def sides
    [@length, @breadth, @length, @breadth]
  end
end

class Square
  include Perimeter

  def initialize(side)
    @side = side
  end

  def sides
    [@side, @side, @side, @side]
  end
end

当您致电Rectangle.new(2, 3).perimeter时,它会按预期返回10。

在这种情况下,模块通过从类中调用sides方法来获取参数。 模块如何访问该方法?是因为include关键字吗?

1 个答案:

答案 0 :(得分:4)

  

模块如何访问该方法?

那是完全模块的功能。基本上,您可以在模块中定义一组方法,然后包含它,最终结果就好像这些方法直接在您的类中一样。

如果你想要更多的技术,包括一个模块将它注入你的班级'祖先链。

Rectangle.ancestors # => [Rectangle, Perimeter, Object, Kernel, BasicObject]

您可能熟悉Enumerable模块。它包含许多有用的方法,例如reducemapcount等。它们都是使用方法each实现的,这是Enumerable模块未实现的一种方法。这是缺失的一块。现在,如果你有一个类(某种类型的集合,也许是。家谱树或其他东西)并且它实现了each,你可以在该类中包含Enumerable并且vo,现在你可以{{1}你的收藏。对于mapperimeter来说,情况也是如此。