--算术运算操作符 --二元 + - * / % ^这个是(指数) --一元 -(负号) -- x = 2 -- n = x^0.5 --x的平方根(开平方) -- m = x^(-1/3) --x的立方根的倒数 -- print(n) -- print(m) -- x = math.pi --x = 3.141592653.... -- print(x - x%0.01) -->3.14 保留两位小 --关系运算符 --< > <= >= == ~=(等同于不等性测试) (ture,false) --逻辑操作符 and or not (false,nil视为假) --(符合短路逻辑) -- print(4 and 5) --5 -- print(nil and 13) --nil -- print(false and 13) -- false -- print(4 or 5) -- 4 -- print(false or 5) --5 --都符合短路逻辑 -- x = x or v -- if not x then x = v end --两条语句等价 --在没有初始化x的时候为nil所以为假,or根据短路选择x = v -- (a and b) or c -- -- a ? b: c --C语言,等价上面语句 -- max = (x > y) and x or y -- --求最大值 --优先级 (高到低) -- ^ -- not # -(负号) -- * / % -- + - -- .. -- < > <= >= ~= == -- and -- or --table构造式{} days = {"sunday","monday","friday"} --days[1] == sunday ,所以上面是数组初始化,下标1开始 print(days[1]) a = {x=10 ,y=20} print(a.x) w = {x=0,y=0,label="console"} x = {math.sin(0),math.sin(1),math.sin(2)} w[1] = "another field" x.f = w print(w.["x"]) print(w[1]) print(x.f[1]) w.x = nil --链表表达式 list = nil for line in io.lines() do list = {next = list,value = line} end --遍历链表 local l = list while l do print(l.value) l = l.next end -- polyline = { color = "blue",thickness = 2, npoints = 4, {x=0, y=0}, {x=-10,y=0}, {x=-10,y=1}, {x=0,y=1} } print(polyline[2].x) print(polyline[3].y) print(polyline[4].y) --用表达式来初始化索引值 opnames = {["+"] = "add",["-"] = "sub" ["*"] = "mul",["/"] = "div"} i = 20; s = "-" a = {[i+0] = s ,[i+1] = s..s,[i+2] = s..s..s} print(opnames[s]) print(a[22]) -- -- --局部变量与块block -- x = 10 --全局 -- local i = 1 --局部作用域只限于block -- while i <= x do -- local x = i*2 -- print(x) -- i = i + 1 -- end -- if i > 20 then -- local x -- x = 20 -- print(x + 2) -- else -- print(x) -- end --do-end--显式的界定一个block do local a,b,c = 3,6,9 local a2 = 2*a local d = (b^2 - 4*a*c)^(1/2) x1 = (-b + d) /a2 x2 = (-b - d) /a2 end local a,b = 1,10 if a < b then print(a) local a --具有隐式nil print(a) end print(a,b) foo = 1 local foo = foo --语句 if a < b then return a else return b end if line > MAXLINES then showpage() line = 0 end if op == "+" then r = a + b elseif op == "-" then r = a - b else error("invalid operation") end local i = 1 while a[i] do print(a[i]) i = i + 1 end ------repeat until --until为真就停止循环 repeat line = io.read() until line ~= "" print(line) ----数字型for for i=1,100 do print("输出100次") end for i=1,100,2 do --2是自加数,可选,不写则为1 print("-") end for i=1,math.huge do --math.huge没有上限 print(i) if(i = 10) break end end --泛型for for i,v in ipairs(a) do print(v) end --ipairs(a) lua基础库里的迭代函数 --i是索引值,v是该索引对应的数组元素 --常见迭代器 --迭代文件每行(io.lines) --迭代table元素(pairs) --迭代数组(ipairs) --迭代字符串中单词(string.gmatch) --遍历table t中所有key for k in pairs(t) do print(k) end for k in pairs(t) do print(k) end --逆向table days = {"sunday","Monday","Friday"} revDays = {} for k,v in pairs(days) do revDays[v] = k end x = "sunday" print(revDays[x]) ---- --function print "hello world" dofile 'a.lua' print[[ a multi-line message]] function add(a) local sum = 0 for i,v in ipairs(a) do sum = sum + v end return sum end --function可以返回多个值--求最大值与其下标 function maximum(a) local mi = 1 local m = a[mi] for i,val in ipairs(a) do if val > m then mi = i;m = val end end return m,mi end print(maximum({8,10,34,23,5})) print(unpack{10,20,30})--接收一组数组作为参数,并返回所有 --变长参数 function add( ... ) --...表示可以接受不同数量的实参 local s = 0 for i,v in ipairs{...}do s = s + v end return s end print("总和为:",add(3,4,10,25,12)) ----- function foo( a,b,c ) end --等价 function foo( ... ) local a,b,c = ... end ----格式化文件并输出文本---- function fwrite( fmt,... ) return io.wirte(string.format(fmt,...)) end ---select-----select('#',...)变长参数的总数 for i = 1,select('#',...) do local arg = select(i,...) --得到第i个参数 end ------- Lua | 果冻想 -------http://www.jellythink.com/archives/category/language/lua 闭包函数参考 -------http://www.jellythink.com/archives/506 自定义迭代器,泛型for参考