--算术运算操作符
--二元 + - * / % ^这个是(指数)
--一元 -(负号)
-- 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参考
转载于:https://my.oschina.net/u/1862653/blog/403161