在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1. Lua -i main.lua -i 进入交互模式 -l 加载一个库 -e “lua code” 直接在命令行执行lua code 2. 注释
-- This is a line comment
--[[ This block show how to block commenting some lines ]]-- 3. 数据数型 8种基本数据类型:nil, boolean, number, string, function, userdata, thread, and table.
4. String. 1)字符串值不能修改,只能生成另一个字符串。 2)可用#来获取一个字符串的length。 3)[[ 双括号可以 扩起多行 长字符串]]。 4).. 是字符串连接符,不要用+ a = "one string"
b = string.gsub(a, "one", "another") print(#a) 【10】 print b 【another string】 5) I/O io.read(), we read a line from the standard input. As write is simpler than read, we will look at it first. The io.write function simply gets an arbitrary number of string arguments and writes them to the current output file. Numbers are converted to strings following the usual conversion rules; for full control over this conversion, you should use the format function, from the string library:> io.write("sin (3) = ", math.sin(3), "\n") --> sin (3) = 0.1411200080598672 > io.write(string.format("sin (3) = %.4f\n", math.sin(3))) --> sin (3) = 0.1411 As a rule, you should use print for quick-and-dirty programs, or for debugging, and write when you need full control over your output: > print("hello", "Lua"); print("Hi") --> hello Lua --> Hi > io.write("hello", "Lua"); io.write("Hi", "\n") --> helloLuaHi
6) Pattern (^区配字符串开头,$区配字符串结尾,大写表示补集,例如 %S+ 配区一个非空字符串) . all characters %a letters %c control characters %d digits %l lower case letters %p punctuation characters %s space characters %u upper case letters %w alphanumeric characters %x hexadecimal digits %z the character with representation ‘[][]’ 方括号可以匹配任何一个括号中的模式,如果[]中第一个符号是^,表示匹配一个非本[]内字符的字符。 * 匹配0个或多个,越多越好
5. Table a = {}
a["x"] = 10 相当于 a.x = 10 注意: a.x 表示 a["x"] ,此时x是一个字符串,做索引。 a = { x=10, y =20} 相当于 a = {}; a.x =10; a.y =20 i = 0; a = {[i+0] = "a", [i+1] = "b", [i+3] = "c"} 表示数组只需要用数字做为索引即可, a = {"10", "20", "30"} 相当于 a[1] = "10; a[2] = "20"; a[3] = "30", Lua数组下标默认是1开始,要用0的话,可以显示的写成 a= {[0] = "10", "20", "30"}
6. if语句,for循环
if a<0 then
a = 0 end if a<b then
return a else return b end if op == "+" then r = a + b elseif op == "-" then r = a - b else error("invalid operation") end a = {}
for i=1,100[,k] do -- k为步长,可省略不写,默认值为1,若想递减可改为-1 a[i] = i; end
while 条件 do
end
repeat
until 条件 7. 操作符
and, or 是短路求值,即当第一个参数能决定表达式的值时,就不再去判断第二个参数。
x = x and v, 意思是如果x非空,那么x = v,x 若为nil/fasle,x = nil/false
x = x or v ,意思是如果x为空,那么x=v,否则 x = x
优先级,from the higher to the lower priority: ^
not - (unary) * / + - .. < > <= >= ~= == and or 8. 变量赋值
a, b, c = 1, 2, 3 -- 一次赋值多个变量
a, b, c = 0 -- b,c会被赋值为nil a, b, c = 0, 1, 2, 3 -- 3会被丢掉 x, y = y, x -- 交换x与y的值 local a = 1 -- local 关键字用来定义局部变量,尽量多的使用局部变量是一种美德 9. 变长参数 & 泛型for
function add(...)
local s = 0 for i, v in ipairs{...} do -- i为index, v 为value s = s +v end return s end 10. Function.
function new_counter()
local i=0 return function() i = i +1 return i end end
c1 = new_counter() print(c1()) --> 1 print(c1()) --> 2 11. 协程(coroutine) 1) 协程的四种状态: 挂起(suspended), 运行(running),死亡(dead),正常(normal) 2) 协程创建后处于挂起状态,需要coroutine.resume(协程名)才能执行。 co = coroutine.create(function() print("hi") end)
print(co) -->thread:0x8071d98 print(coroutine.status(co)) -->suspended coroutine.resume(co) --> hi 3) 调用coroutine.yield,可让协程挂起。 co = coroutine.create( function()
for i = 1, 10 do print("co", i) coroutine.yield() end end coroutine.resume(co) -->co 1 print(coroutine.status(co)) --> suspended coroutine.resume(co) -->co 2 coroutine.resume(co) -->co 3 ... coroutine.resume(co) -->co 10 coroutine.resume(co) --> 什么都不打印,返回false
function run_coroutine(thread)
local status, value = coroutine.resume(thread) return value end function stop_coroutine(x) coroutine.yield(x) end function inputer() return coroutine.create(function() while true do local line = io.read() stop_coroutine(line) end end) end function outputer(thread) return coroutine.create(function() for line = 1, 5 do local x = run_coroutine(thread) x = string.format("%5d Enter is %s", line, x) stop_coroutine(x) end end) end function main(thread) while true do local obtain = run_coroutine(thread) if obtain then io.write(obtain, "\n\n") else break end end end p = inputer() f = outputer(p) main(f) 11. Lua中的冒号,函数参数
a:add(100) == a.add(self, 100) --即隐藏self参数。
--一个函数若只有一个参数,并且此参数是一个字符串或table构造式,那么函数调用的圆括号便可以省略掉。例如: print "hello world" == print("hello world") f{x=10, y=20} == f({x=10,y=20}) 12. Metatables
setmetatable(x, mt) -- use "mt" as the metatable for "x"
local x = {value = 5} -- creating local table x containing one key,value of value,5
local mt = { __add = function (lhs, rhs) -- "add" event handler return { value = lhs.value + rhs.value } end } setmetatable(x, mt) -- use "mt" as the metatable for "x" local y = x + x print(y.value) --> 10 -- Note: print(y) will just give us the table code i.e table: <some tablecode> local z = y + y -- error, y doesn't have our metatable. this can be fixed by setting the metatable of the new object inside the metamethod 13. require 与 module
require用于搜索的Lua文件的路径存放在变量package.path中, 如果require无法找到与模块名相符的Lua文件,那Lua就会开始找C程序库;
local moduleName = ... local arg = select(i, ...) -- 得到第i个参数 for i = 1, select('#', ...) do print(select(i, ...)) end 调用select时,必须传入一个固定实参selector和一系列变长参数。
Userdata
. Thread
|
请发表评论