| 脚本语法说明—表达式 |
● 概述
● 算术运算符
● 关系运算符
● 逻辑运算符
● 连接运算符
● 表构造式
概述
● UL中的表达式包括数字常量、字符串常量、变量、一元和二元运算符、函数调用,还可以是非传统的函数定义和表构造。
算术运算符
● 二元运算符:+ - * / ^ (加减乘除幂)
● 一元运算符:- (负值)
备注:这些运算符的操作数都是实数。
关系运算符
● < > < = > = == ~=
备注:返回结果为false或true;==和~=比较两个值,如果两个值类型不同,UL认为两者不同;nil只和自己相等。UL通过引用比较tables、 functions。也就是说当且仅当两者表示同一个对象时相等。
Eg:
a = {}; a.x = 1; a.y = 0
b = {}; b.x = 1; b.y = 0
c = a
a==c but a~=b
备注:当比较不同类型的值的时候要特别注意,混合比较数字和字符串UL会报错。比如:2 < "15"
Eg:
"0" == 0 -- false
2 < 15 -- true
"2" < "15" -- false
逻辑运算符
● And:a and b -- 如果a为false,则返回a,否则返回b
● Or: a or b -- 如果a为true,则返回a,否则返回b
Eg:
uPrintf (4 and 5) --> 5
uPrintf (nil and 13) --> nil
uPrintf (false and 13) --> false
uPrintf (4 or 5) --> 4
uPrintf (false or 5) --> 5
备注:逻辑运算符认为false和nil是假(false),其他为true,0也是true。
连接运算符
● 字符串连接,可使用操作符“..”如果操作数为数字,UL将数字转成字符串。
Eg:
uPrintf ("Hello " .. "World") --> Hello World
uPrintf (0 .. 1) --> 01
UL操作符的优先级

备注:在二元操作符中,除了“^”和“..”是“右结合”的,其他操作符都是“左结合”的。
Eg:
a+i < b/2+1 <--> (a+i) < ((b/2)+1)
5+x^2*8 <--> 5+((x^2)*8)
a < y and y <= z <--> (a < y) and (y <= z)
-x^2 <--> -(x^2)
x^y^z <--> x^(y^z)
表构造式
● 构造式是创建和初始化表的表达式。表是UL特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表,可以直接初始化数组。
Eg:
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
--[[ UL将"Sunday"初始化days[1](第一个元素索引为1),用"Monday"初始化days[2]...]]--
uPrintf(days[4]) --> Wednesday
● 构造函数可以使用任何表达式初始化:
Eg:
tab = {sin(1), sin(2), sin(3), sin(4),sin(5),sin(6), sin(7), sin(8)}
● 如果想初始化一个表作为记录使用可以这样:
Eg:
a = {x=0, y=0} <--> a = {}; a.x=0; a.y=0
● 不管用何种方式创建表,我们都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。
Eg:
w = {x=0, y=0, label="console"}
x = {sin(0), sin(1), sin(2)}
w[1] = "another field"
x.f = w
uPrintf (w["x"]) --> 0
uPrintf (w[1]) --> another field
uPrintf (x.f[1]) --> another field
w.x = nil -- remove field "x"
● 在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。
● UL中,超过一层的表结构在作为全局变量时会失效。
Eg:
w = {a[1], y=0, label="console"} --w[1]的值只能在当前代码块中有效。而w.y是一个全局变量,在一个脚本球内均有效。