设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 6122|回复: 12

[原创发布] 跟我从头学Ruby(2)

 关闭 [复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
22403
在线时间
2335 小时
注册时间
2005-10-15
帖子
1160

开拓者

发表于 2005-11-9 06:34:24 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
第二章  常量与变量

第一节  Ruby的数据

    任何一种语言,在进入语法的第一课总是看似深奥实则简单但又十分枯燥的,Ruby也不能免俗。所以这章看上去可能会让人昏昏欲睡,没办法……
    学语言先从单词开始。那么学Ruby自然也要从Ruby的“单词”——变量和常量开始了。不论变量也好,常量也好,它们存放的都是数据。
    作为一种面向对象的语言,Ruby的所有数据都是作为对象的实例而存在的,就连1、"A"这样的简单的数字和字符串也不例外,1是Numeric类的实例,"A"则是String类的实例。所有的数据都是对象,这大大方便了它们的操作定义和互相之间的转换。
    总体来说,Ruby的数据有以下几种格式:
      数值型数据:整数(Integer)、长整数(Fixnum)、超长整数(Bignum)、浮点数(Float)
      字符型数据:字符(String)、正规字符串(Regexp)
      集合型数据:子界(Range)、数组(Array)、哈希表(Hash)
      布尔型数据:假(FalseClass)、真(TrueClass)
      其他型数据:时间(Time)、文件(File)、符号(Symbol)等等
      空白型数据:空(NilClass)
      最后还有一类,也是用的最广泛的,用户自定义的Class型数据,由于对象封装的特性,Class型数据在处理方法上的对待会几乎等同于其他系统默认的类型。
      这些不同类的数据,各自有各自不同的方法,关于方法的定义和再定义,这里先不多说。仅就最常用的两类数据:数值和字符串来说,它们的调用还是相当直观和方便的。
    说到调用数据,那就要进入我们的下一个话题:常量与变量

第二节  常量

    常量,顾名思义就是在游戏过程中永远保持一个特定数据的量,它不会随着外界环境的变化而发生改变,一直保有它的数据,并可以将这些数据传给其他对象比如变量。
    就像我们通常用姓名或ID来标识自己一样,用来标识常量的东西叫做常量名。姓名不能胡乱起,注册ID更是有诸多限制,而给常量取名也是一样有规矩的。Ruby中常量名的命名规则是:
      以大写字母开头,其后可以跟大小写字母、下划线或者数字,且不能是系统保留字。
    比如以下就是一个合法的常量名:
      CENTER_X
    而以下这些就不能作为常量名:
      BEGIN (系统保留字)
      b_2   (不是大写字母开头)
      T-5   (出现了不合法的字符)
    大写字母开头的系统保留字一共有两个,给常量取名时注意避开:
      BEGIN                END
    常量名的定义和初始化(就是给常量一个值)使用赋值号"=":比如下面这样
      CENTER_X = 240
    这样就定义了一个常量CENTER_X,它是一个整数型常量,其值是240。
    然后我们来看一下这个常量的值:
      p CENTER_X

    运行结果:显示一个对话框,上面是数字240。

    常量的作用范围是它所处的对象类内部,在这里它一直有效。常量可以在不同层次的对象中重复定义,取值时以内层的优先。这点和后面要讲到的变量不一样。
    关于常量的作用范围,我们来看这样一个例子:
      把上例中的脚本拆成两条事件指令,像下图那样:

      然后保存并执行游戏,和事件NPC说话,结果和上例是一样的。
    然后再进一步:
      把上例中的脚本拆成两个事件,分别放到两个NPC上,保存后执行游戏,先和执行
        CENTER_X = 240
      的NPC说话,再和执行
        p CENTER_X
      的NPC说话,结果和上例依然是一样的。
      这里引出一个问题:未定义的常量是不能引用的,如果你和NPC说话的顺序反了,就会出现下面这个结果:

      这个提示的意思是,存在未经定义的常量 CENTER_X。
      以后记住,当使用一个常量时,一定要先行定义。
    索性更极端一些吧。
      新建一张地图,把后面那个NPC放到新地图上去,再在前一张地图的脚本事件后加一个“场所移动”事件,移到新地图上。

      好了,执行游戏,先后和两张地图上的NPC说话,你看见了什么?
      --依然是一模一样的结果。
    这已经充分说明了常量的作用范围是相当大的。实际上,即使不是在这个对象类中,你也可以通过前面加对象类名称的方法调用别的对象的常量。

第三节  变量

    大凡接触RPG Maker的对“变量”这个概念应该不会陌生。默认工程里提供了50个变量给你,你可以扩充到多达5000个。变量在游戏进程中持有一个数值,它的数值是可以随时改变的。
    数值可以随时改变,这是常量和变量最大的不同。
    变量是存放在内存的某个地址中的。要访问这个变量,当然也要用到变量的标识符——变量名。Ruby的变量名命名规则是:
      以小写字母、下划线或接头符$或@开头,其后可跟大小写字母,数字,下划线,但不能是系统保留字。
    比如以下是合法的变量名:
      abc
      variable_x
      $game_temp
      @phase4_step
    以下则不能用作变量名:
      def    (系统保留字)
      Amy    (不是以小写字母/下划线/接头符开头)
      x31-bc0(出现了非法字符)
    需要注意的是,对于系统保留字,一旦前面加上了接头符就不再作为保留字:
      @def
      $def
    都是允许作为变量名使用的,系统中以小写字母开头的保留字一共36个,取名时注意回避:
      alias   and     begin   break
      case    class   def     defined?
      do      else    elsif   end
      ensure  false   for     if
      in      module  next    nil
      not     or      redo    rescue
      retry   return  self    super
      then    true    undef   unless
      until   when    while   yield
    变量的定义也是通过赋值来进行。作为脚本语言,Ruby没有对变量进行非常严格的类型控制,只要不执行自运算操作而是简单的赋值,你可以随时将已经存放了某一类型数据的变量更改成另一种类型数据的变量。
    我们来看一个例子:
      abc = 4
      p abc
      abc = 5
      p abc
      abc = "I'm sorry"
      p abc

    这里连续对abc进行了3次定义,并一次次的输出它们的值。
    运行的结果应该是先后显示3个对话框,分别是4,5和字符串"I'm sorry"。
    下面我们来研究一下,既然常量有那么大的作用范围,那变量的作用范围又有多大呢?奇怪的接头符是什么意思呢?如果变量没定义就要它输出,会是什么结果呢?
    实验还是重复先前的步骤,首先将变量的赋值和输出拆成两个事件指令。

    执行的结果竟然是在这一步就出现了问题,系统报错误:

    说没有定义一个叫做abc的局部变量。
    重来,修改它们,在abc前面加上@接头符。

    这会再执行,结果正常了,显示一个对话框上面是1。
    第二步是将这两条语句拆分到两个事件里,然后执行游戏,和两个NPC分别说话,这回不再报错了。
    如果先和第一个NPC,再和第二个NPC说话,将显示1,如果直接去和第二个NPC说话,将显示nil,而不是像先前常量那样报错。
    这里我们可以得出结论,带有@接头符的变量,当它在被定义前就要求输出时,会自动定义并赋予一个nil的初始值。nil表示“空”“什么都没有”的意思。
    然后再做一步,将这两个NPC扔到两张地图上,给前张地图一个场所移动,结果仍然会正常输出1。
    这说明,只要变量带上了@接头符,它的作用范围就已经相当于常量的作用范围了,至少在我们所目前接触到的事件脚本里,它是一直通用的。
    不过,以后深入系统对象以后,你会发现,@接头符的变量只能在自己的对象里使用,从对象外部是调用不了的(不像常量可以通过对象类名称来调用)。我们之所以放在事件脚本里用@就足够,是因为事件脚本从属于“事件解释器”这个对象,自然一直都能使用。如果想创造一个任何情况下都可以用的变量,请使用接头符$。
    $的作用是使变量全域化,它会在任何时间任何地方允许Ruby程序访问、调用、计算这个变量。
    重做以上实验,把@换成$,你会发现结果是完全一样的,无论如何都不会报错。和@一样,没有定义过的$变量在输出时也会自动给一个nil值。
    好了,关于常量和变量的部分已经讲完了。也许你看的半懂半糊涂之际,还觉得有点不过瘾吧,连事件的“变量操作”都不是仅仅一个代入的操作呢,至少还有加、减、乘、除等其他方法,难道Ruby的变量就只能完成简单的代入值吗?好,请看第三章:句法构造和表达式。
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
22403
在线时间
2335 小时
注册时间
2005-10-15
帖子
1160

开拓者

 楼主| 发表于 2005-11-9 06:34:24 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
第二章  常量与变量

第一节  Ruby的数据

    任何一种语言,在进入语法的第一课总是看似深奥实则简单但又十分枯燥的,Ruby也不能免俗。所以这章看上去可能会让人昏昏欲睡,没办法……
    学语言先从单词开始。那么学Ruby自然也要从Ruby的“单词”——变量和常量开始了。不论变量也好,常量也好,它们存放的都是数据。
    作为一种面向对象的语言,Ruby的所有数据都是作为对象的实例而存在的,就连1、"A"这样的简单的数字和字符串也不例外,1是Numeric类的实例,"A"则是String类的实例。所有的数据都是对象,这大大方便了它们的操作定义和互相之间的转换。
    总体来说,Ruby的数据有以下几种格式:
      数值型数据:整数(Integer)、长整数(Fixnum)、超长整数(Bignum)、浮点数(Float)
      字符型数据:字符(String)、正规字符串(Regexp)
      集合型数据:子界(Range)、数组(Array)、哈希表(Hash)
      布尔型数据:假(FalseClass)、真(TrueClass)
      其他型数据:时间(Time)、文件(File)、符号(Symbol)等等
      空白型数据:空(NilClass)
      最后还有一类,也是用的最广泛的,用户自定义的Class型数据,由于对象封装的特性,Class型数据在处理方法上的对待会几乎等同于其他系统默认的类型。
      这些不同类的数据,各自有各自不同的方法,关于方法的定义和再定义,这里先不多说。仅就最常用的两类数据:数值和字符串来说,它们的调用还是相当直观和方便的。
    说到调用数据,那就要进入我们的下一个话题:常量与变量

第二节  常量

    常量,顾名思义就是在游戏过程中永远保持一个特定数据的量,它不会随着外界环境的变化而发生改变,一直保有它的数据,并可以将这些数据传给其他对象比如变量。
    就像我们通常用姓名或ID来标识自己一样,用来标识常量的东西叫做常量名。姓名不能胡乱起,注册ID更是有诸多限制,而给常量取名也是一样有规矩的。Ruby中常量名的命名规则是:
      以大写字母开头,其后可以跟大小写字母、下划线或者数字,且不能是系统保留字。
    比如以下就是一个合法的常量名:
      CENTER_X
    而以下这些就不能作为常量名:
      BEGIN (系统保留字)
      b_2   (不是大写字母开头)
      T-5   (出现了不合法的字符)
    大写字母开头的系统保留字一共有两个,给常量取名时注意避开:
      BEGIN                END
    常量名的定义和初始化(就是给常量一个值)使用赋值号"=":比如下面这样
      CENTER_X = 240
    这样就定义了一个常量CENTER_X,它是一个整数型常量,其值是240。
    然后我们来看一下这个常量的值:
      p CENTER_X

    运行结果:显示一个对话框,上面是数字240。

    常量的作用范围是它所处的对象类内部,在这里它一直有效。常量可以在不同层次的对象中重复定义,取值时以内层的优先。这点和后面要讲到的变量不一样。
    关于常量的作用范围,我们来看这样一个例子:
      把上例中的脚本拆成两条事件指令,像下图那样:

      然后保存并执行游戏,和事件NPC说话,结果和上例是一样的。
    然后再进一步:
      把上例中的脚本拆成两个事件,分别放到两个NPC上,保存后执行游戏,先和执行
        CENTER_X = 240
      的NPC说话,再和执行
        p CENTER_X
      的NPC说话,结果和上例依然是一样的。
      这里引出一个问题:未定义的常量是不能引用的,如果你和NPC说话的顺序反了,就会出现下面这个结果:

      这个提示的意思是,存在未经定义的常量 CENTER_X。
      以后记住,当使用一个常量时,一定要先行定义。
    索性更极端一些吧。
      新建一张地图,把后面那个NPC放到新地图上去,再在前一张地图的脚本事件后加一个“场所移动”事件,移到新地图上。

      好了,执行游戏,先后和两张地图上的NPC说话,你看见了什么?
      --依然是一模一样的结果。
    这已经充分说明了常量的作用范围是相当大的。实际上,即使不是在这个对象类中,你也可以通过前面加对象类名称的方法调用别的对象的常量。

第三节  变量

    大凡接触RPG Maker的对“变量”这个概念应该不会陌生。默认工程里提供了50个变量给你,你可以扩充到多达5000个。变量在游戏进程中持有一个数值,它的数值是可以随时改变的。
    数值可以随时改变,这是常量和变量最大的不同。
    变量是存放在内存的某个地址中的。要访问这个变量,当然也要用到变量的标识符——变量名。Ruby的变量名命名规则是:
      以小写字母、下划线或接头符$或@开头,其后可跟大小写字母,数字,下划线,但不能是系统保留字。
    比如以下是合法的变量名:
      abc
      variable_x
      $game_temp
      @phase4_step
    以下则不能用作变量名:
      def    (系统保留字)
      Amy    (不是以小写字母/下划线/接头符开头)
      x31-bc0(出现了非法字符)
    需要注意的是,对于系统保留字,一旦前面加上了接头符就不再作为保留字:
      @def
      $def
    都是允许作为变量名使用的,系统中以小写字母开头的保留字一共36个,取名时注意回避:
      alias   and     begin   break
      case    class   def     defined?
      do      else    elsif   end
      ensure  false   for     if
      in      module  next    nil
      not     or      redo    rescue
      retry   return  self    super
      then    true    undef   unless
      until   when    while   yield
    变量的定义也是通过赋值来进行。作为脚本语言,Ruby没有对变量进行非常严格的类型控制,只要不执行自运算操作而是简单的赋值,你可以随时将已经存放了某一类型数据的变量更改成另一种类型数据的变量。
    我们来看一个例子:
      abc = 4
      p abc
      abc = 5
      p abc
      abc = "I'm sorry"
      p abc

    这里连续对abc进行了3次定义,并一次次的输出它们的值。
    运行的结果应该是先后显示3个对话框,分别是4,5和字符串"I'm sorry"。
    下面我们来研究一下,既然常量有那么大的作用范围,那变量的作用范围又有多大呢?奇怪的接头符是什么意思呢?如果变量没定义就要它输出,会是什么结果呢?
    实验还是重复先前的步骤,首先将变量的赋值和输出拆成两个事件指令。

    执行的结果竟然是在这一步就出现了问题,系统报错误:

    说没有定义一个叫做abc的局部变量。
    重来,修改它们,在abc前面加上@接头符。

    这会再执行,结果正常了,显示一个对话框上面是1。
    第二步是将这两条语句拆分到两个事件里,然后执行游戏,和两个NPC分别说话,这回不再报错了。
    如果先和第一个NPC,再和第二个NPC说话,将显示1,如果直接去和第二个NPC说话,将显示nil,而不是像先前常量那样报错。
    这里我们可以得出结论,带有@接头符的变量,当它在被定义前就要求输出时,会自动定义并赋予一个nil的初始值。nil表示“空”“什么都没有”的意思。
    然后再做一步,将这两个NPC扔到两张地图上,给前张地图一个场所移动,结果仍然会正常输出1。
    这说明,只要变量带上了@接头符,它的作用范围就已经相当于常量的作用范围了,至少在我们所目前接触到的事件脚本里,它是一直通用的。
    不过,以后深入系统对象以后,你会发现,@接头符的变量只能在自己的对象里使用,从对象外部是调用不了的(不像常量可以通过对象类名称来调用)。我们之所以放在事件脚本里用@就足够,是因为事件脚本从属于“事件解释器”这个对象,自然一直都能使用。如果想创造一个任何情况下都可以用的变量,请使用接头符$。
    $的作用是使变量全域化,它会在任何时间任何地方允许Ruby程序访问、调用、计算这个变量。
    重做以上实验,把@换成$,你会发现结果是完全一样的,无论如何都不会报错。和@一样,没有定义过的$变量在输出时也会自动给一个nil值。
    好了,关于常量和变量的部分已经讲完了。也许你看的半懂半糊涂之际,还觉得有点不过瘾吧,连事件的“变量操作”都不是仅仅一个代入的操作呢,至少还有加、减、乘、除等其他方法,难道Ruby的变量就只能完成简单的代入值吗?好,请看第三章:句法构造和表达式。
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv1.梦旅人

梦石
0
星屑
65
在线时间
2 小时
注册时间
2005-10-21
帖子
96
发表于 2005-11-9 06:36:40 | 显示全部楼层
哇哇,先抢沙发.....{/dy}

后来的就只有自己搬小板凳坐了哦.{/cy}

然后再慢慢看...

看完了,感觉....
好少{/fd}{/fd},强烈期待后面的!!!
[FLY][B]Think Globally - Act locally[/B][/FLY]
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
66
在线时间
1 小时
注册时间
2005-11-4
帖子
358
发表于 2005-11-9 06:55:38 | 显示全部楼层
不错
不过我建议LZ出一个语法表
把所有需要用的基本语法写上
这样对于我这类喜欢自学的人快一些
(我原来就是看了文曲星上自带的VB解释表,然后自己悟出VB的使用方法的)
原签名太大,被咔嚓了。重新换一个吧。by 管理员  [偶就不修改,你咬我啊~? :P]
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
8 小时
注册时间
2005-10-21
帖子
377
发表于 2005-11-9 07:01:00 | 显示全部楼层
说什么好呢?大家一起来拜吧~~~
作为RGSS废柴的我终于看到自己的黎明了么?
世界上没有英雄,所以我的故事里也没有勇者...
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
274 小时
注册时间
2005-10-22
帖子
192
发表于 2005-12-2 23:52:05 | 显示全部楼层
没别的,就是这个{/qiang}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
85
在线时间
1 小时
注册时间
2005-11-23
帖子
2
发表于 2005-12-3 00:33:41 | 显示全部楼层
{/qiang}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
10
在线时间
0 小时
注册时间
2005-12-2
帖子
1
发表于 2005-12-3 00:55:06 | 显示全部楼层
顶下
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2005-11-29
帖子
297
发表于 2005-12-3 01:55:29 | 显示全部楼层
{/se}{/se}{/se}{/se}{/se}{/se}{/se}{/se}{/se}
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
145
在线时间
128 小时
注册时间
2005-10-22
帖子
1441

贵宾

发表于 2005-12-3 03:09:46 | 显示全部楼层
强烈支持``可惜偶看不懂……{/dk}
唉 装X迟早被雷霹,有捧着的,就得有泼凉水的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-18 09:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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