运算符教程 |
|
在本页中,我们将使用=
表达式简写符号。这些值可以很容易地分配给一个变量,例如:
> x = 7
> print(x)
7
> = 7
7
Lua 具有常见的二元算术运算符。
> = 2+3, 5-12, 2*7, 7/8 5 -7 14 0.875 > = 5*(2-8.3)/77.7+99.1 98.694594594595
> = -(-10), -(10) 10 -10
> = 15%7, -4%3, 5.5%1 1 2 0.5
> = 7^2, 107^0, 2^8 49 1 256
关系运算符返回布尔值true
或false
。
==
等于
~=
不等于
<
小于
>
大于
<=
小于或等于
>=
大于或等于
示例
> = 1 == 1, 1 == 0 true false > = 1 ~= 1, 1 ~= 0 false true > = 3 < 7, 7 < 7, 8 < 7 true false false > = 3 > 7, 7 > 7, 8 > 7 false false true > = 3 <= 7, 7 <= 7, 8 <= 7 true true false > = 3 >= 7, 7 >= 7, 8 >= 7 false true true
> = "abc" < "def" true > = "abc" > "def" false > = "abb" < "baa" true > = "abc" == "abc" true > = "abc" == "a".."bc" true
> = {} == "table" false > = {} == {} -- two different tables are created here false > t = {} > t2 = t > = t == t2 -- we're referencing the same table here true
> = "10" == 10 false > = tonumber("10") == 10 true
Lua 提供了逻辑运算符and
、or
和not
。在 Lua 中,nil
和布尔值false
在逻辑表达式中都表示假。任何不是假(nil
或false
)的值都是true
,包括 0,这对于来自某些其他语言的人来说可能令人惊讶。在本页末尾有更多关于此含义的说明。
> = false==nil -- although they are both considered false by logical operators, they're still different values false > = true==false, true~=false false true > = 1==0 false
关键字not
反转逻辑表达式的值
> = true, false, not true, not false true false false true > = not nil -- nil represents false true > = not not true -- true is not not true! true > = not "foo" -- anything not false or nil is true false
二元运算符and
不一定返回布尔值true
或false
到逻辑表达式x and y。在某些语言中,and
运算符返回一个取决于两个输入的布尔值。相反,在 Lua 中,如果第一个参数的值为false
或nil
,则它返回第一个参数(甚至不执行第二个参数),如果第一个参数不是false
或nil
,则返回第二个参数。因此,只有当第一个参数为false
或第二个参数为布尔值时,才会返回布尔值。即最小化求值。
> = false and true -- false is returned because it is the first argument false > = nil and true -- as above nil > = nil and false nil > = nil and "hello", false and "hello" nil false > = false and print("hello") -- the print function isn't evaluated, so "hello" isn't printed false
> = true and false false > = true and true true > = 1 and "hello", "hello" and "there" hello there > = true and nil nil > = true and print("hello") -- the print function is evaluated here, so "hello" is printed hello nil
or
二元运算符也不一定返回布尔值(参见上面关于 and
的说明)。如果第一个参数为真,则返回第一个参数,否则返回第二个参数。因此,只有当第一个参数为 true
或第二个参数为布尔值时,才会返回布尔值。
> = true or false true > = true or nil true > = "hello" or "there", 1 or 0 hello 1 > = true or print("hello") -- the print function isn't evaluated, so "hello" isn't printed true
false
或 nil
。
> = false or true true > = nil or true true > = nil or "hello" hello > = false or print("hello") -- the print function is evaluated here, so "hello" is printed hello
这可能是一个非常有用的特性。例如,在函数中设置默认值
> function foo(x) >> local value = x or "default" -- if argument x is false or nil, value becomes "default" >> print(value, x) >> end > > foo() -- no arguments, so x is nil default nil > foo(1) 1 1 > foo(true) true true > foo("hello") hello hello
尽管 Lua 没有三元运算符(if/else 表达式),但可以使用 and
和 or
来创建类似的行为
value = condition and trueval or falseval;
and
的优先级高于 or
value = (condition and trueval) or falseval;
and
运行 trueval 并返回其值。否则,整个 and
表达式部分将为假,触发 or
表达式运行 falseval。请注意,如果 trueval 为 nil
或 false
,则会运行 falseval。如果已知 falseval 始终为“真”值,则可以通过否定 condition 来解决此问题,否则您只需要使用 if-then-else 语句。
这在“value = false and true or false”的情况下不起作用。