幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4809|回复: 40

[原创]跟我一起学ruby——第二天 0.9版

[复制链接]

28

主题

239

帖子

3451

积分

⑥精研

流氓甲

积分
3451
发表于 2005-1-23 20:24:31 | 显示全部楼层 |阅读模式
跟我一起学ruby——第二天

* 注:本教程在http://www.diyrpg.com/上发表,授权给幻想森林论坛使用。版权属于作者Tiger。其他人转载需要注明出处。


第一章——类,对象和方法
--------------------------------------------------------------------------
基础知识
既然说Ruby是一种纯粹的面向对象编程的脚本语言,那么我就从对象开始学起。

一、对象是什么?
游戏中的任何东西都可以被可以解释为对象。
钱的数目是对象,村长是对象,流氓甲也是象。因为Ruby所能处理的值都是对象,为了方便对象的操作就引进了类的概念。

二、类是什么?
对象的种类就称为类。
村长和流氓甲属于NPC类,钱的数目属于自然数类(注:这里所说的类你可以自己定,你也可以说村长和流氓甲属于人类:属于哺乳类:属于...)
一些特殊的属于这个类的对象叫作类的实体(或实例)。
在日常生活中,我们对一切对象的分类都是有一定层次的。
我们知道:生物〉动物〉哺乳类〉人类
村长和流氓甲属于人类,它就一定有哺乳类的属性,也就一定有动物的属性。我们称生物是动物的父类,动物是生物子类,不难发现子类会继承父类的属性。当然也会遇到这样的情况:父类的某些属性不可以被某一特定的子类继承——虽然一般鸟类都会飞,但企鹅是鸟类中不会飞的一个子类。
得到自然界这种规律的启发,Ruby就引进了继承。它大大减少了程序员的工作量,我们只需要定义一个父类(或叫做超类)的属性,它的子类就会自动继承它父类的属性。当然当你遇到像上文提及的那个企鹅特例还要新增或重定义子类和父类之间的区别。继承的意思,就是保持被继承者的性质但却同时拥有自己独有的特性。
引进了类只是方便对象的操作,那么究竟怎么操作对象呢?那就要用方法了。

三、方法什么?
方法是某个类中所有的对象专用的命令。
你只需在某个对象上调用某个方法就可以让这个对象施行这个方法所代表的方法。而这个被操作的对象称为“作用实例”或是“方法的参数”。
比如说你养了许多狗,(狗是一个类,被你养的狗是它的子类)有一个叫旺财(旺财是对象,也是实例),你每天训练他们坐下(这是在定义一个方法),之后每当你发号坐下这个命令时(这是在调用坐下这个方法)被你养的狗就会坐下。(你就通过方法完成了对对象的操作)。假如被你养的狗还分狼狗和哈巴狗二类,(狼狗和哈巴狗是被你养的狗的子类),它们会继承它父类中定义过的方法。当然一个类中可以定义许多方法(你可以教狗许多东西)。
又比如说把Ruby看作CD机,CD机所操作的一切东西——CD就是所有的对象,类是歌曲的风格(如R&M是一类,Rap是另一类);当然你也可以把歌手当类的分法(如周杰伦是一类,陈奕迅是另一类),而调用方法就是按播放按钮,停止按钮,暂停按钮等。
--------------------------------------------------------------------------
实践基础
在Ruby中创造一个对象并对其进行操作的步骤如下:
首先得定义类的属性——
一、类的定义
格式:

class 类名
类中定义的内容
end

注意:类名必须以大写字母开头。
如果是一个子类就这样写:

class 子类名< 父类名
类中定义的内容
end

或在定义后面直接写上:

class 子类名 < 父类名
end

这只是让父类继承父类,不是重定义。为什么这么说呢?
光有一个类还不行,接着再往里面塞方法,以便以后对对象的操作。

二、方法的定义
方法的定义写在“类中定义的内容”那里
格式:

def
方法中定义的内容
end
注意:方法必须以小写字母开头。

当然当你遇到像上文提及的那个企鹅特别的子类时,你还要重定义子类和父类之间的区别这叫称为重载,格式同上。方法的调用如反复定义,则以最后一次为准。
在子类方法中调用父类相同方法的情况下,要使用关键词 super。super将调用被当前方法覆盖的父类中的同名方法。
格式:

super(定义的内容, ... )

若省略括号和参数时,将会把当前方法的参数原封不动地传递给父类中的同名方法。若调用时不想使用参数的话,请使用括号显式地标出,像super()这样。
最后创造一个属于这个类的对象(实例)——

三、实例的创造
格式:

实例名 =类名.new

实例终于创造好了,现在就该对它进行操作了。

四、方法的调用
在ruby里,我们通过点 . 来调用一个对象的方法
格式:

已创造的实例名.方法名

如果你要创造一只临时存在的实例,并给其加上方法:

(类名.new).方法名
或:
类名.new.方法名
--------------------------------------------------------------------------
Type&Run
一(首格的数字别打!)

1  class NPC
2    def intro
3      print "我是NPC?"
4    end
5  end
6
7  class Lioumang<NPC
8    def talk
9     print "XX在村子的南方"
10   end
11 end
12
13  流氓甲=Lioumang.new
14  流氓甲.talk   #显示 我是NPC?
15  流氓甲.intro  #因为流氓甲继承了它的父类的方法,所以显示 XX在村子的南方

说明:
1~5定义一个类——NPC
5~11定义一个NPC的子类——Lioumang
2~4为NPC定义一个名叫intro的方法,print " "的做用是显示“”内的东西。(先不要管它怎么运作的)
8~10为Lioumang定义一个名叫talk的方法
13创造实例——流氓甲
14为流氓甲调用talk的方法
15为流氓甲调用intro的方法




1  class NPC
2    def intro
3      print "aaa"
4    end
5  end
6
7  class Lioumang<NPC
8    def intro
9      print "bbb"
10   end
11 end
12
13  流氓甲=Lioumang.new
14  流氓甲.intro

说明:
显示的是bbb,可见方法的调用如反复定义,则以最后一次为准。但如果13行变为 流氓甲=NPC.new 则显示aaa



1  class NPC
2    def intro
3      print "aaa"
4    end
5    def  talk
6            print  "ccc"
7    end   
8  end
9
10  class NPC
11    def intro
12      print "bbb"
13   end
14 end
15
16  流氓甲=NPC.new
17  流氓甲.intro
18  流氓甲.talk

说明:
先显示的是bbb,再显示ccc,可见类如反复定义,则以保留他们交集的补集,他们的交集以最后一次为准。但如果13行变为 流氓甲=NPC.new 则显示aaa。



1  class NPC
2    def talk(a=nil)  #nil为空集
3      p a
4    end
5  end
6
7  class Lioumang < NPC
8    def talk(a)
9      super(5)       # 以5作为参数进行调用
10     super(a)       # 以5作为参数进行调用
11     super          # 以5作为参数进行调用,super(a)的简写
12     a = 1         
13     super          # 以1作为参数进行调用,super(a)的简写
14     super()        # 无参数的调用
15   end
16 end
17 Lioumang.new.talk 5

说明:
2~4方法的作用是显示变量a,而a=nil,既显示nil
可见:若省略Super的括号和参数时,将会把当前方法的参数原封不动地传递给父类中的同名方法。若调用时不想使用参数的话,请使用括号显式地标出,像super()这样。
------------------------------------------------------------------------------------------------------------------------
总结

------------------------------------------------------------------------------------------------------------------------
作业

究竟什么才是"面向对象"?

---------------------------------------------------------------------------
参考答案


[此贴子已经被作者于2005-8-17 17:19:05编辑过]
R界最大的知识词典: http://www.diyrpg.com/wiki
回复

使用道具 举报

carol3 该用户已被删除
发表于 2005-1-23 22:45:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

28

主题

239

帖子

3451

积分

⑥精研

流氓甲

积分
3451
 楼主| 发表于 2005-1-24 09:33:39 | 显示全部楼层
以下是引用carol3在2005-1-23 22:45:05的发言:

好啊,还真是一天一份啊。究竟什么才是\"面向对象\"?——这个问题,恐怕不是接触面向对象编程一两天的新人能够解答得了的。

有没有教学进度?贴出来一个。也许我能帮你。


我也不知道究竟什么才是\"面向对象\",

\"有没有教学进度?贴出来一个。\"我没有,我学到哪就写到哪,问一下,我接下来该学变量好呢,还是学RM的内部类好?
R界最大的知识词典: http://www.diyrpg.com/wiki
回复 支持 反对

使用道具 举报

carol3 该用户已被删除
发表于 2005-1-24 11:55:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

8

主题

38

帖子

300

积分

④见习

三用陆行鸟

积分
300
QQ
发表于 2005-1-24 20:27:27 | 显示全部楼层
我觉得还是按学程序的经典顺序来教的好,因为看起来真的有点混乱,而且像老大(carol3,我以后就跟他了,什么?本人不同意,死缠!)说的那样,什么是面向对象比较对初学者来说比较难明,所以总是放到比较后的,因为这是你学的顺序我也不能说太多东西,我还是认为先学学关于一些变量,语法的那些,然后逐步加深,其实我也想跟你学学,因为Ruby我也是刚接触没多久,期待ing
[em01]
没有最强,只有超越
回复 支持 反对

使用道具 举报

1

主题

24

帖子

123

积分

③业余

无静晴川(消失中)

积分
123
发表于 2005-1-24 23:26:14 | 显示全部楼层
看完“第一天”了,现在看第二天,呵呵
楼主辛苦了,谢谢
甭理我,我消失了,大家继续。。。
回复 支持 反对

使用道具 举报

1

主题

24

帖子

123

积分

③业余

无静晴川(消失中)

积分
123
发表于 2005-1-24 23:55:09 | 显示全部楼层
请问下面这段中  流氓甲.talk   为什么显示“我是NPC?”而不是“XX在村子的南方”
而 流氓甲.intro  为什么显示“XX在村子的南方”而不是“我是NPC?”
1  class NPC
2    def intro
3      print \"我是NPC?\"
4    end
5  end
6
7  class Lioumang<NPC
8    def talk
9     print \"XX在村子的南方\"
10   end
11 end
12
13  流氓甲=Lioumang.new
14  流氓甲.talk   #显示 我是NPC?
15  流氓甲.intro  #因为流氓甲继承了它的父类的方法,所以显示 XX在村子的南方
甭理我,我消失了,大家继续。。。
回复 支持 反对

使用道具 举报

5

主题

73

帖子

2080

积分

⑥精研

路边的小草

积分
2080
发表于 2005-1-24 23:56:46 | 显示全部楼层
1,2两天看完,一头雾水,so,今天通宵补课!
回复 支持 反对

使用道具 举报

1

主题

24

帖子

123

积分

③业余

无静晴川(消失中)

积分
123
发表于 2005-1-25 00:09:29 | 显示全部楼层
我还好,多少对面对对象有那么一点了解
甭理我,我消失了,大家继续。。。
回复 支持 反对

使用道具 举报

carol3 该用户已被删除
发表于 2005-1-25 01:23:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2025-6-23 04:51 , Processed in 0.014309 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表