programming in lua (2)

3-4 章。

lua 支持的数值运算符有:+(加),-(减),*(乘),/(除),^(指数),%(求余),-(取相反数)。% 还有取特定精度的作用,例如 x%1 表示取 x 的整数部分,而x%0.01 则取到小数点后两位。

关系运算符:<><=>===~=(不等于)。

逻辑运算符:andornot

连接操作符:..(将两个字符串连接起来)。

运算符的优先级从高到低排列,同一行的运算符优先级相同,按出现的位置从左往右结合:

^
not # -(取相反数)
* / %
+ -
..
< > <= >= ~= ==
and
or

实在记不清的话加括号就行了。

table 的初始化使用 {} 或者在 {} 中包含初始值:

letters = {"a", "b", "c", "d", "e"}
print(letters[3]) -- "c"

table 下标从 1 开始(看来如果不显式指定 key 的值默认用下标代替 key)。另外也可以使用下面的语法进行初始化:

a = {x = 10, y = 20}
b = {}; b.x = 10; b.y = 20
print(a["x"]) -- 10

a 和 b 的初始化方法是等价的。初始化还可以嵌套:

a = {
{x = 10, y = 20},
{x = -10, y = -20}
}
print(a[2]["y"]) -- -20

上面两种初始化的方法都有限制,例如索引不能为负数,或者 key 的值不是合法的标识符(合法的标识符以字母,数字和下划线组成,并且开头不能是数字)。lua 提供了另外一种初始化的方法:

opnames = {["+"] = "add", ["-"] = "sub"}
a = {[-2] = 100, [-1] = 10}
print(opnames["+"]) -- "add"
print(a[-1]) -- 10

如果需要数组的下标从 0 开始,利用上面的初始化方法可以这样写:

a = {[0] = "a", "b", "c", "d", "e"}
print(a[0]) -- a
print(a[1]) -- b

“b”的下标从 1 开始,因为它是列表的第一个元素(因为“a”是指定了 key 为 0 的元素,而除了“a”之外都没指定 key,默认就从 1 开始编号了)。

lua 中的函数中默认数组下标从 1 开始,所以最好不要指定下标从 0 开始。

另外在初始化列表中使用分号代替逗号也是可以的,这个可以用来标识不同的块:

a = {x = 10; y = 45; "one", "two", "three",}
print(a["x"]) -- 10
print(a[2]) -- "two"

在最后一个元素后加上逗号也是合法的。

除了前面提到的单个元素赋值以外,lua 还支持多个元素分别赋值:

x, y = 10, 20
print(x) -- 10
print(y) -- 20

lua 会先将等号右边的值都计算出来,再进行赋值操作,所以交换两个元素的值可以这样写:

x,y = y, x

如果等号左边的元素个数比右边的少,那么右边多出来的元素会被忽略;如果右边的比左边的少,那么左边多出来的元素会被赋值为 nil:

x, y, z = 10, 20 -- x = 10, y = 20, z = nil
x, y = 10, 30, 50 -- x = 10, y = 30

条件分支的语法:

if condition then
   do something
end

或者

if condition1 then
   do something
elseif condition2 then
   do something
end

while 循环的语法:

while condition do
   do something
end

repeat 循环的语法:

repeat
   do something
until condition

for 循环有两种,一种是数值型的,语法是

for var = exp1, exp2, exp3 do
   do something
end

表示变量从 exp1 递增到 exp2,递增的步长是 exp3。如果省略了 exp3 则默认为 1。例如:

for i = 1, 10, 2 do
   print(i)
end

打印 1-10 之间的单数。如果想使用无限循环,exp2 使用 math.huge。

另一种 for 循环的形式是通过迭代器访问所有元素,例如:

days = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}

for k, v in pairs(days) do
   print(v, k)
end

上面提到的变量默认都是全局变量,如果需要使用一个局部变量,在变量前加上关键字“local”:

for var = 1, 10, 2 do
   local i
   i = var + 1
   print(i)
end

print(i) -- nil

变量 i 只在 for 循环内有效,在 for 循环之后使用的 i 是全局变量,不同于 for 循环里的 i,被初始化为 nil。

在循环里使用 break 可以立即退出当前循环,马上执行循环后的第一条语句:

a = {"a", "b", "c", "d", "e"}

i = 1
while a[i] do
   if a[i] == "c" then
      break
   end
   i = i + 1
end

print("i =", i)

return 可以立即终止当前函数。每个函数的最后都隐含有一个 return 语句。

从语法上来讲,break 和 return 只能是块中的最后一条语句,即它们的位置是关键字 end,else 或者 until 之前。

Comments (2)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注