ruby中我们经常用Module来扩展类的功能,我们常常看到这样的代码:

1
2
3
4
5
6
7
8
9
10
module Sayable
def say
puts "hello"
end
end

class People
extend Sayable
include Sayable
end

我们看到我们在这里分别使用了extendinclude,那么extendinclude有什么区别呢?我们接下来实验一下:
我们先定义一个module,然后定义两个类分别使用extendinclude,然后看看这个两个类的扩展有啥区别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module Testable
def test
puts "test"
end
end

class A
extend Testable
end

class B
include Testable
end

A.test # test
A.new.test # NoMethodError: private method `test' called for #<A:0x007f9528d33b40>

B.test # NoMethodError: private method `test' called for B:Class
B.new.test # test

看到上面的实验结果我们知道当我们extend一个模块的时候,这个模块的所有方法会变成扩展类类方法,而当我们include一个模块的时候,这个模块的所有方法会变成扩展类实例方法