a = true b = (a and {false} or {true})[1] if b then print("true") else print("false") end
自定义迭代器
自定义迭代器的格式:
for 变量列表 in 迭代函数, 状态变量, 控制变量 do -- 循环体 end
自定义无状态迭代器
functionsquare(iteratorMaxCount, currentNumber) if currentNumber < iteratorMaxCount then currentNumber = currentNumber + 1 return currentNumber, currentNumber * currentNumber end end
for i, n in square, 3, 0 do print(i, n) end
多状态迭代器: 多个状态可以存放在table,因此只需要一个参数即可:
array = {"Google", "Runoob"}
functionelementIterator(collection) local index = 0 local count = #collection -- 闭包函数 returnfunction() index = index + 1 if index <= count then -- 返回迭代器的当前元素 return collection[index] end end end
for element in elementIterator(array) do print(element) end
循环时的goto语句
可以使用goto语句来实现continue:
for i=1, 3do if i <= 2then print(i, "yes continue") goto continue end print(i, " no continue") ::continue:: print([[i'm end]]) end
t_table = setmetatable({k1 = "v1"}, { __newindex = function(t_table, key, value) rawset(t_table, key, "\"v" .. value .. "\"") end })
t_table["k2"] = 2
print(t_table["k1"]) print(t_table["k2"])
--[[ 输出是: v1 "v2" --]]
其它的规则:
元表
运算符
__add
+
__sub
-
__mul
*
__div
/
__mod
%
__unm
-(相反数)
__concat
..
__eq
==
__lt
<
__le
<=
__add和__tostring:
t_table = setmetatable({1, 2, 3}, {__add = function(t_table, data) t_table[#t_table + 1] = data return t_table end, __tostring = function(t_table) local res = "" for _, v inpairs(t_table) do res = res .. v end return res end }) print(t_table) print(t_table + 4) --[[ 输出: 123 1234 --]]
a_metatable = { __unm = function(a_table) local _temp_table = {} for i = #a_table, 1, -1do _temp_table[#a_table + 1 - i] = a_table[i] end return _temp_table end } p_metatable = { __tostring = function(a_table) local res = "" for _, v inpairs(a_table) do res = res .. v end return res end } a_table = setmetatable({1, 2, 3}, a_metatable) b_table = setmetatable(-a_table, p_metatable) print(b_table)