{人活着如果没有梦想,那和咸鱼有什么分别。但是仅仅有梦想,却不脚踏实地的去追寻,撑死也就是条晒干的咸鱼}
/注释///
--: 行注释;
--[[
code
-- ]]: 块注释;
---[[
code
--]]: 块反注释;
基础类型/
1. nil // 表示无效或者删除变量;一个全局变量(非local)赋值为nil的时候,系统会回收这个变量分配的内存
2. boolean(false / true) // false 和nil都等同于“false”, 其他都等同于“true”
3. number // 表示实数 eg: 3 0.4 8.27e-3;
4. string // 一对匹配的‘’或者“”来定义, eg:”teststr“ ‘teststr’
tostring()//数字转str, tonumber(), (number .. "teststr")//str转字符串
#:放字符串前面,获取字符串长度 eg: #"I'm test str"
// 转义字符用到在查不必记
注意在linux下的换行(\n)和windows下的对换行(\r\n)的定义;
5. table
eg: a = { x = “sunday”, y = ”monday“ }; // 键值对, 索引值对
t.x = a["x"]; // 结果为”sunday“, 引号和点号表示键值对访问方式;
t[x] = a[变量x的值],eg: x = 1; t[x] // 结果为sunday, 如果x是实数类型则表示索引值对访问方式(类数组),如果x = ”x“即键值对访问;
table.maxn // 返回一个table的最大正索引值;
数组通常以1作为索引起点值,#a或者nil作为界定数组结尾的标准;
//可以将table变量赋值给其他变量; eg: b = a; print( b.x );
6. function:
支持多返回值, 不定个数参数传递, 【丢掉多余的,用nil补充不足的,赋值传参一个道理】
///运算符//
1 算术运算符[7种]
+ 、- 、*、/ 、 ^(幂)、%(求模)、-(负数) // 特别注意%,很有用
当操作数为整数时候,结果与第二个操作数类型保持一致; 当为实数的时候就有所不同
eg: x = 1.11; print( x%1) -- 0.11 // 返回x的小数部分;
实用:x = 1.111111;
print( x - x%0.01)-- 1.11 保留两位小数;
print( x - x%0.001)-- 1.111保留三位小数;
2.关系运算符【6种】
<、> 、<=、 >=、 ==、 ~= 结果均返回boolean类型;
userdata和table的比较Lua是实用的引用方式比较的
eg: a = { x=1 }; b = { x=1 }; c=a; -- a == c , a ~= b, c ~=b;
另外 2 < 15, "2" > "15";
3. 逻辑运算符
and or not
(a and b) or c == a ? b : c; -- lua的类似三目运算符的实现, 前提是b ~= false;
4.长度运算符【#】
目标操作数必须是string 或者 table类型;
///Statement
break return goto 和c一样, 貌似没有continue???
1. assignment
多重赋值和传参一个道理,多余的被舍弃,补足的补nil;
但是建议最好只用基本赋值, 清晰明了易读;
2. 结构控制;
a. if condition then
body
elseif condition then
body
else
body
end
b. while condition do
body
end
c. repeat
body
until condition// condition为repeat的结束条件;
d. for: Numeric for 和 Generic for;
Numeric for:
eg: for var = exp1, exp2, exp3 do-- exp1 起值, exp2 终值 exp3 步进值 ,步进值可以不写使用默认值;
body
end
Generic for: // 泛型;
遍历文件io.lines, table(pairs), 序列(ipairs), 字符串的每个字符(string.gmatch);
eg: for <var_list> in <exp_list> do
body
end
eg: for i, v in pairs(a) do // 遍历table;
body
end
e. assert(V, mess) -- 同 c的assert; mess 为错误发生时返回的信息;
dofile(); 加载chunk并且运行, loadfile只加载chunk, 并将chunk作为一个函数返回;
load尽量别用;
error(string msg); --返回值是一个string类型, 包含文件名+ 代码所在行+预定义的msg;
traceback,回溯 ,xpcall, debug.debug;
coroutine
co = coroutine.create( function(...)
for i=1, 2 do
print(i);
coroutine.yield(co);// 挂起协程, 只能在协程内部使用,外部使用会报错;
end
end )
print( coroutine.status( co ) ); -- 协程创建过后就是suspended状态, 另外有running,dead, normal
print( coroutine.resume( co ) ); --执行打印1, 挂起;
print( coroutine.status( co ) ); --suspended;
print( coroutine.resume( co ) ); --接着执行; 执行完毕即为dead;
print( coroutine.status( co ) ); -- dead;