|
楼主 |
发表于 2012-2-13 19:26:33
|
显示全部楼层
2.1、Galaxy的变量类型
算法的处理对象就是数据,而数据有其特殊的存在方式。数据依据内容的不同区分成多种变量类型。变量类型其实就是变量能够存储的值的种类。Galaxy中的变量类型如下: 表2-1 Galaxy中的变量类型。
表2-1内容排序依据SE中的变量类型名称顺序排序。
大家仔细阅读的话,会发现有几种变量类型使用的是相同的变量类型,如传输信息、计时器窗口、行星、整数等都是采用了int变量类型;属性ID、水体、字符串等都采用了string变量类型。具体原因与存储方式有关,这里不做说明。
变量类型有两类,一类是正常存储数据的变量类型,我称之为基础变量类型;一类是多个数据组合的复合类型的变量类型,我称之为复合变量类型。
关于这点大家可以先看Native.galaxy中的注释。
代码 2-1 Native.galaxy中有关变量类型的注释
[codes=galaxy]
//--------------------------------------------------------------------------------------------------
// About Types
//--------------------------------------------------------------------------------------------------
//
// -- Complex types and automatic deletion --
//
// Many native types represent "complex" objects (i.e. larger than 4 bytes). The script language
// automatically keeps track of these objects and deletes them from memory when they are no longer
// used (that is, when nothing in the script references them any longer). The types which benefit
// from automatic deletion are:
//
// abilcmd, bank, camerainfo, marker, order, playergroup, point,
// region, soundlink, string, text, timer, transmissionsource, unitfilter, unitgroup, unitref,
// waveinfo, wavetarget
//
// Other object types must be explicitly destroyed with the appropriate native function when you
// are done using them.
//
//
// -- Complex types and equality --
//
// Normally, comparing two "complex" objects with the == or != operators will only compare the
// object reference, not the contained object data. However, a few types will compare the contained
// data instead. These types are:
//
// abilcmd, point, string, unitfilter, unitref
//
// Examples:
//
// Point(1, 2) == Point(1, 2) // True
// "test string" == "test string" // True (note: this is case sensitive)
// AbilityCommand("move", 0) == AbilityCommand("move", 0) // True
// Order(abilCmd) == Order(abilCmd) // False (two different order instances)
// RegionEmpty() == RegionEmpty() // False (two different region instances)
//
//
// -- Complex types and +/- operators --
//
// Besides numerical types (byte, int, fixed), a few complex types support + and/or - operators:
//
// string, text + operator will concatenate the strings or text
// point +/- operators will add or subtract the x and y components of the points[/codes]
对此注释的翻译(来源:http://bbs.islga.org/read-htm-tid-40285.html,由头目翻译):
//--------------------------------------------------------------------------------------------------
// 关于类型
//--------------------------------------------------------------------------------------------------
//
// -- 复合类型与自动删除 --
//
// 许多原生类型代表“复合”对象(通常大于4字节)。银河脚本语言会自动追踪这些对象,当他们不再被使用时就将他们从
// 内存中移除(“不再被使用”的意思是没有任何指向他们的脚本引用)。受益于自动删除的类型有:
//
// abilcmd, bank, camerainfo, marker, order, playergroup, point,
// region, soundlink, string, text, timer, transmissionsource, unitfilter, unitgroup, unitref,
// waveinfo, wavetarget
//
// 而如果你想干掉其余对象类型则需要使用与之对应的显式销毁函数来进行销毁。
//
//
// -- 复合类型与等值比较 --
//
// 通常的,两个“复合”类型之间进行==操作或!=操作只会比较两者的引用,而非其引用的对象的值。然而,少数对象类型却会直接对其引用的对象的值进行比较。这些类型是:
//
// abilcmd, point, string, unitfilter, unitref
//
// 举例:
//
// Point(1, 2) == Point(1, 2) // 真
// "test string" == "test string" // 真 (注意:大小写敏感)
// AbilityCommand("move", 0) == AbilityCommand("move", 0) // 真
// Order(abilCmd) == Order(abilCmd) // 假 (两个不同指令实例)
// RegionEmpty() == RegionEmpty() // 假 (两个不同区域实例)
//
//
// -- 复合类型与 +/- 操作 --
//
// 除了数值类型(byte, int, fixed)以外,少数复合类型也支持+或-操作:
//
// string, text + 操作用于合并string或text
// point +/- 操作将会对点的x,y坐标进行增减
通过等值比较的说明,我们可以看到。复合变量直接存储的内容并非是存储的值。而是这些值的引用。
如图2-1所示,如果不考虑从引用到存储数据之间的关系,复合变量可以看做存储内容为引用的基础变量,从内存上来说,复合变量的表也是与基础变量一样的。当调用复合变量时,多运行一步依照引用值获取实际存储内容的步骤。
这些复合变量类型与基础变量类型在使用中的差别。将在讲解相关内容时说明。
基础变量类型包括:byte,bool,int,fixed,string。其他基本都是复合变量类型。(此论断仅是个人臆断,没有对所有变量逐一测试。)
图2-1存储关系为个人猜测,我的水平无法做实际验证,仅作为理解基础变量和复合变量差异的辅助。 |
|