我不太明白这是如何运作的:
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
关键字吗?
答案 0 :(得分:4)
模块如何访问该方法?
那是完全模块的功能。基本上,您可以在模块中定义一组方法,然后包含它,最终结果就好像这些方法直接在您的类中一样。
如果你想要更多的技术,包括一个模块将它注入你的班级'祖先链。
Rectangle.ancestors # => [Rectangle, Perimeter, Object, Kernel, BasicObject]
您可能熟悉Enumerable
模块。它包含许多有用的方法,例如reduce
,map
,count
等。它们都是使用方法each
实现的,这是Enumerable模块未实现的一种方法。这是缺失的一块。现在,如果你有一个类(某种类型的集合,也许是。家谱树或其他东西)并且它实现了each
,你可以在该类中包含Enumerable
并且vo,现在你可以{{1}你的收藏。对于map
和perimeter
来说,情况也是如此。