Lua 中有这些基本表达式:
exp ::= prefixexp exp ::= nil | false | true exp ::= Number exp ::= String exp ::= function exp ::= tableconstructor exp ::= `...´ exp ::= exp binop exp exp ::= unop exp prefixexp ::= var | functioncall | `(´ exp `)´
数字和字符串在 §2.1 中解释;
变量在 §2.3 中解释;
函数定义在 §2.5.9 中解释;
函数调用在 §2.5.8 中解释;
table 的构造在 §2.5.7 中解释;
可变参数的表达式写作三个点 ('...
') ,它只能被用在有可变参数的函数中;
这些在 §2.5.9 中解释。
二元操作符包含有数学运算操作符(参见 §2.5.1), 比较操作符(参见 §2.5.2),逻辑操作符(参见 §2.5.3), 以及连接操作符(参见 §2.5.4)。 一元操作符包括负号(参见see §2.5.1), 取反 not(参见 §2.5.3), 和取长度操作符(参见 §2.5.5)。
函数调用和可变参数表达式都可以放在多重返回值中。 如果表达式作为一个独立语句段出现(参见 §2.4.6) (这只能是一个函数调用), 它们的返回列表将被对齐到零个元素,也就是忽略所有返回值。 如果表达式用于表达式列表的最后(或者是唯一)的元素, 就不会有任何的对齐操作(除非函数调用用括号括起来)。 在任何其它的情况下,Lua 将把表达式结果看成单一元素, 忽略除第一个之外的任何值。
这里有一些例子:
f() -- 调整到 0 个结果 g(f(), x) -- f() 被调整到一个结果 g(x, f()) -- g 被传入 x 加上所有 f() 的返回值 a,b,c = f(), x -- f() 被调整到一个结果 ( c 在这里被赋为 nil ) a,b = ... -- a 被赋值为可变参数中的第一个, -- b 被赋值为第二个 (如果可变参数中并没有对应的值, -- 这里 a 和 b 都有可能被赋为 nil) a,b,c = x, f() -- f() 被调整为两个结果 a,b,c = f() -- f() 被调整为三个结果 return f() -- 返回 f() 返回的所有结果 return ... -- 返回所有从可变参数中接收来的值 return x,y,f() -- 返回 x, y, 以及所有 f() 的返回值 {f()} -- 用 f() 的所有返回值创建一个列表 {...} -- 用可变参数中的所有值创建一个列表 {f(), nil} -- f() 被调整为一个结果
被括号括起来的表达式永远被当作一个值。所以,
(f(x,y,z))
即使 f
返回多个值,这个表达式永远是一个单一值。
((f(x,y,z))
的值是 f
返回的第一个值。如果 f
不返回值的话,那么它的值就是 nil 。)