赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
楼上说的很正确,不过还是忍不住想补充下:
模块本身是一个抽象的数据结构,不是一个具体的对象~
这两种不同的方法定义方式其实就分别定义了静态方法和动态方法——
静态方法属于类/模块本身,在整个程序的生命周期中只会初始化一次,可以在不同的对象实例之间共享,所以可以通过类/模块名字空间直接引用;
动态方法属于类/模块的实例,每次建立一个新的对象时都会为其分配新的空间,所以又称为实例方法,需要通过一个实例才能引用~
模块的实例方法比较特殊,因为模块本身不可实例化,所以主要是用于模块和类的混入时,导入模块的实例方法供类使用的:module A
def aaa
p 1
end
end
class B
include A # B 类包含模块 A 的数据
end
B.new.aaa # 通过 B 的实例调用 aaa 方法
为什么要分成静态和动态呢?
以上是抽象定义,可能不太好理解,举个形象点的例子吧~
有一个类叫 [Person],我们想给 Person,也就是人,添加一些基本的行为: [eat]、[sleep]、[cry]、[smile],但是张三、李四、其他每个人都有不同的吃法、睡法、哭法、笑法,并且这些行为直接影响的是他们自己~所以我们把这些行为都定义为实例方法,针对不同的人的实例(对象)都有一份属于实例自己的行为拷贝……
我们还想定义一个方法,这个方法描述人类是一种什么样的生物,但由于这里我们是针对“人”这个抽象的集合(人“类”),而不是针对某个人的实例,比如张三、李四,所以我们把这个描述人的方法定义为 [Person] 类的静态方法:class Person
def Person.description
return "人,属于哺乳纲灵长目人科人属智人种。"
end
end 之后直接通过“人”这个抽象概念来调用这个方法:p "Q:人是一种什么动物?"
p "A:" + Person.description 系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~ |
|