Lua文档翻译(中)
类型
Lua是动态类型语言,不需要人为指明变量类型,脚本解释器会自动判断变量类型。简单的说,给变量赋什么类型的值,变量就变成什么类型。
Lua是动态类型语言,不需要人为指明变量类型,脚本解释器会自动判断变量类型。简单的说,给变量赋什么类型的值,变量就变成什么类型。
Lua是动态类型语言,不需要人为指明变量类型,脚本解释器会自动判断变量类型。简单的说,给变量赋什么类型的值,变量就变成什么类型。
函数type(var)返回变量var的类型名。
注意:不同类型的变量用“==”比较总是为false,false == nil也是false。为避免不易查出的错误,不要比较不同类型的变量。
引用类型
数据表类型(table),函数类型(function),用户定义类型(userdata) 都是引用类型。即他们是对内容的引用,多个引用类型的变量可以引用同一个内容。
例:
local table1 = {1, 2, 3, 4}
local table2 = table1 -- table1和table2都引用同一个数据表
table2[2] = 99
print(table1[2]) -- table1[2] = 99
如果引用类型没有提供自己的==、~=运算符操作,则执行缺省的比较运算,即判断两引用是否指向同一内容;注意不是比较内容是否一致。
例:
{} == {} -- 永远为false,因为创建了两个空数据表,它们不是同一个数据表。
变量
Lua处理局部变量要比处理全局变量快几倍,所以尽量使用局部变量。在所有函数外部即全局也可声明局部变量,差别是全局变量一直存在,而声明在全局的局部变量只在该模块的生存期存在,并只能被声明它的模块访问。
使用全局变量有难以发现的错误,例:
g_DeamonCount = 10
...
g_DeamonCuont = 20 -- 拼写错误,o和u颠倒了,但不会被脚本解释器发现,
-- 因为一个新的全局变量被创建了
Lua正在加入global关键字以解决此问题。
读取未赋值的变量也不会报错,所以最好声明变量时赋个缺省值。
函数嵌套
函数既是可执行的命令,也是可使用的数据,所以函数满足变量的作用域规则,即只在声明它的块内存在,例:
function foo()
...
end
do
function foo()
...
end
foo() -- 调用do...end内的foo()
end
foo() -- 调用全局的foo()
即 function foo()..end 等同于 local foo = function()...end
一些库函数
dofile(文件名) -- 执行指定文件中的脚本
print(e1, e2, ...) -- 显示变量或常量的值
math.abs(v) -- 取v的绝对值
math.acos(v), math.asin(v) -- 反余弦,反正弦
math.atan(y/x), math.atan2(y, x) -- 反正切,前者只适用于第一象限,后者可用于所有象限
math.floor(v) -- 取小于等于v的最大整数
math.ceil(v) -- 取大于等于v的最小整数
math.cos(v), math.sin(v), math.tan(v) -- 取余弦,正弦,正切
math.deg(v) -- 弧度变角度
math, rad(v) -- 角度变弧度
math.exp(v) -- 取e的v次幂
math.log(v) -- 取以e为底的对数(自然对数)
math.log10(v) -- 取以10为底的对数
math.pow(x, y) -- 即x的y次幂
math.min(v1, v2, ...), math.max(v1, v2, ...) -- 取最小的,最大的
math.mod(v1, v2) -- 取v1 / v2的余数
math.sqrt(v) -- 取v的平方根
math.random() -- 取0到1的随机小数
math.random(upper) -- 取1到upper的随机整数
math.random(lower, upper) -- 取lower到upper的随机整数
math.randomseed(seed) -- 置随机数种子
写游戏脚本的注意事项
尽量使用本系列文档中提到的用法:Lua本身语法很松,用法很灵活,在看其它文档和样例时会有在此没有提到的语法内容,这些语法内容不是必要的,但却容易导致错误或带来过大的复杂性。例如用(test) and v1 or v2 来模拟C语言的三元表达式,我们不推荐使用。