表达式

表达式从变量值和文字值计算值。

  • 算术运算
  • 关系操作
  • 逻辑运算
  • 连接
  • 长度
  • 优先级

算术运算

算术运算是对数值进行的。如果在算术运算中使用字符串值,则将其转换为数字——如果转换失败,则返回一个错误。

a + b 加上a和b
a - b a减去b
a * b 乘以a和b
a / b 用b除a
% b 模= a - math.floor(a/b)*b
a ^ 取a的b次方;B可以是任意数
——一个 否定一个

关系操作

关系操作比较两个值,如果关系满足返回true,如果不满足返回false。关系操作可以在任何类型的值之间执行。如果值的类型不同,则返回false。数字以通常的方式进行比较。字符串使用当前区域设置的排序序列进行比较。

a = = A等于b
~ = b A不等于b
< b A小于b
a > A大于b
< = b A小于等于b
> = b A大于等于b

逻辑运算

逻辑操作传统上是在布尔值上执行的,但在这种语言中,它们可以在任意两个值上执行。Nil和false被认为是false,任何其他值被认为是true。逻辑操作使用快捷计算,如果第一个值决定了操作的结果,则不计算第二个值。

a和b 如果a为false或nil,则返回a else返回b
a或b 如果a不为假且不为空,则返回a else返回b
不是一个 如果a不是false或nil则返回false否则返回true

and和or操作可以用于表达式中的条件求值:

a或b 如果a未初始化(nil),可用于提供默认值b。这对于函数中的可选参数很有用。
A和b或c 可以用来选择非nil值b或c基于条件。如果是真的,那么a和b返回b, b和b或c回报。如果是假的,那么a和b返回false和假c或c的回报。这相当于一个吗?b: c语言。

连接

字符串连接为s1 ..s2。这将创建一个大到足以容纳s1和s2内容的新字符串,并将内容复制到新字符串中。如果s1或s2不是字符串,则会出现错误。注意,重复连接可能有相当大的复制开销。如果你通过一次连接一个字节来构建一个n字节的字符串,这将复制n*(n+1)/2字节。为了获得更好的性能,可以将字符串片段连接到表中(稍后讨论),然后使用table.concat()函数。一个例子是COMBINE_HEADERS()。

长度

字符串s的长度由#s返回。如后面讨论的,#操作符还用于数组表。

优先级

运算符优先级决定运算在表达式中执行的顺序,优先级高的运算在优先级低的运算之前执行。优先顺序可以像往常一样被括号覆盖。例如,在A + b \* c, *的优先级高于+,因此表达式被计算为A + (b \* c)

最高
- Not # -(一元)
- * / %
- ..
- = ~= < > <= >=
-
最低

具有相同优先级的操作从左到右执行(左关联),除了^和..从右到左执行(右关联)。所以a^b^c的值是a^(b^c)

表达式