直接上代码:

module Action
def jump
@distance = rand(4) + 2
puts "I jumped forward #{@distance} feet!"
end
end class Rabbit
include Action
attr_reader :name
def initialize(name)
@name = name
end
end class Cricket
include Action
attr_reader :name
def initialize(name)
@name = name
end
end peter = Rabbit.new("Peter")
jiminy = Cricket.new("Jiminy") peter.jump
jiminy.jump
----------------------------------------------------------------------
输出:
I jumped forward 3 feet!
I jumped forward 4 feet!
nil

Ruby学习之module已经介绍了module

当一个module用来把一些行为和信息混合进一个类, 那么这种行为叫做mixin

mixin允许我们定制一个类而不需要重写这个类。

上面的代码就用到了mixin

在Action这个module中定义了jump方法。把Action包含进了类Rabbit和Cricket,那么这两个类就具有了jump这个方法,所以Rattit和Cricket的实例peter和jiminy才可以调用jump。

你也许发现了, mixin赋予了我们类似类的多继承的能力, 通过mixin这种技巧我们可以从很多module中提取很多行为添加到我们的类中。

05-02 08:29