第二章 常量与变量 第一节 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的变量就只能完成简单的代入值吗?好,请看第三章:句法构造和表达式。
|