lua语言了解

-- 参考


-- Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用


-- 两个减号是单行注释


--[[
 多行注释
 多行注释
 --]]


-- lua变量:下划线、字母、数字;(注意:最好不要用'_A|_VERSION'类似的标识符,容易和lua的保留字冲突)
-- 不能使用特殊符号,区分大小写;


-- lua保留字:and、break、do、else、elseif、end、false、for、function、if、in、local、nil、not、or、repeat、return、then、true、until、while;


-- lua全局变量:
> print(b)
nil
> b=10 
b --(创建变量) 
> print(b) 
10 
> --(当变量值不等于nil时,变量即存在)


-- lua数据类型:
nil --:只有nil属于该类,
-- 表示一个无效的值(条件表达式=false),
-- 比较加双引号 例:type(X)=="nil",
-- 不加双引号比较 例 X == nil(前提条件是声明X变量时,必须赋值,否则比较会出现错误)
-- 删除变量;
Boolean -- :false、true;(注意所有存在的值都被认为是true)
number -- :双精度类型的实浮点数(默认double,‘luaconf.h’中定义);
string -- :双引号或单引号的字符串(也可用 [[ content ]] 表示,该种可以换行表示);
-- string和number之间lua会自动转换;
function-- :由C或lua编写的函数;
userdata -- :任意储存在变量中的C数据结构;
thread -- :执行的独立线路,执行协同程序;
table -- :表--关联数据(索引 数字、字符串)
-- 构造表达式创建 例:{}// 一个空的表,
-- tab1 = { key1 = "val1", key2 = "val2", "val3" };
-- local tab= {[1] = "a", [3] = "b", [4] = "c"}; -- 数组赋值


-- lua数据类型查看:print(type("Hello world")); -->string


-- lua遍历循环:
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
print(k .. " - " .. v) -- 这里的‘..’是链接字符串,‘+ - * /’是运算符
end
-- 该种遍历出的结果先打印‘val3’,后打印键值对,且‘val3’的key是下标值1;


-- lua判断:
if false or nil then
    print("至少有一个是 true")
else
print("false 和 nil 都为 false!")
end


-- lua字符串长度计算‘#’,例:
print(#len);
print(select('#', ...));
select(n, ...);-- 可以访问select(n, ...)到select('#', ...)的参数


-- lua中function定义的函数可传递:method1 = method2;
-- 可以定义匿名函数的方式通过参数传递:
function test(tab, fun)
for k,v in pairs(tab) do
print(fun(k,v));
end
end


tab1={key1="value1", key2='value2'};
test(tab1,
function(key,value)
return key .. "=" .. value;
end
);


tab2={key1='val1', key2='val2'}
test(tab2,
function(key, value)
return key .. '=' .. value;
end
)

-- 线程 thread;协同程序 coroutine
-- lua主要的线程是coroutine,与线程相同的是:都有 独立栈、局部变量、指令指针 与其他coroutine共享全局变量和其他大部分东西;
-- coroutine与thread的区别:thread可以同时运行多个,coroutine在任何时候都只能运行一个,只有在coroutine被suspend时才会暂停;

-- userdata 用户自定义类型:可以存储c/c++的数据类型,供自己调用;


-- lua变量:全局变量、局部变量(local声明)、表中的域;
-- lua变量赋值:a, b = 10, 2*x 等同于--> a=10; b=2*x;(当变量和值的数量不相等时,lua会执行多弃少补(nil)的原则)


-- lua循环:
-- while:
while(condition) do statements end
-- for: 
-- 数值for循环:
for var=exp1,exp2,exp3 do <执行体> end 
-- var的exp1变化到exp2,每次递增exp3,exp3默认1,exp1、exp2、exp3只在开始时加载一次;
-- 泛型for循环:
for i,v in ipairs(a) do print(v) end -- value值为nil时终止循环
-- ipairs与pairs都可循环,不同之处ipairs只能遍历key为整数的数组或键值对,不能返回nil只能返回0,遇nil则停,相对于ipairs,pairs功能较全;
-- repeat ..until: 
repeat statements until( condition ) -- condition为true停止,为false 重新 执行;
-- 以上均可循环嵌套
-- break:
-- lua流程控制:
if then statements end; if then elseif then end; 


-- lua函数:
-- 用途:1.完成指定的任务;2.计算并返回值;
-- 定义格式:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
-- optional_function_scope可选的定制函数(【全局函数】或【局部函数 用local声明】)


-- lua运算符:
-- 算术运算符:+、-、*、/、%(取余)、^(乘幂)、-(负号)
-- 关系运算符:==、~=(不等于)、>、<、>=、<=
-- 逻辑运算符:and、or、not(逻辑非)
-- 其它运算符:..(链接两个字符串)、#(一元运算符,返回字符串或表的长度)
-- 优先级高-->底:【^】、【not、-】、【*、/】、【+、-】、【..】、【关系运算符】、【and】、【or】;除了一元运算符(^、..)所有的二元运算符都是左连接的;
-- lua自定义三目运算符:condition and result1 or result2; -- 注意:result1为false时,只返回result2;


-- lua转义字符:\a、\b、\f、\n、\r、\t、\v、\\、\'、\"、\0、\ddd、\xhh;


-- lua字符串操作:
string.upper(argument); -- 转成大写
string.lower(argument); -- 转成小写
string.gsub(str, character1, character2, num);-- str被替换的字符串,character1被替换的字符,character2替换的字符,num替换几次默认全部
string.sub(str, startNum, endNum);-- 截取str从startNum位到endNum位
string.find(argument, argument1, index);-- argument被查内容 argument1查找字符 index查找索引开始位置
string.reverse(argument);-- 反转字符串
string.char(argument);-- 整数转换为char类型,可多个参数
string.byte(arg[,int]);-- 转换字符为整数,第二个参数为索引默认1,负数时倒查
string.len(argument);-- 字符串的长度
string.rep(argument, n);-- copy argument n遍输出
string.gmatch(str, pattern);-- str字符串 找pattern描述的字符串
string.match(str, pattern, init);-- str字符串 找pattern描述的字符串从init索引开始默认为1;(只返回找到的第一个字符串)

-- lua字符串格式化:string.format(pattern, str1, str2...);-- 以pattern描述格式输出字符串
%a -- 
%c -- 接收数字,转ASCLL码字符
%d,%i -- 接收数字,转带符号数字
-- 正负号:%+d显示正负号,默认只显示负号
-- 宽度:%6.3d 总6位显示3位(小数位可剪裁)
-- 占位符:默认空格,%05d 总5位不足补0
%o -- 接收数字,转八进制格式
%u -- 接收数字,转无符号整数
%x -- 接收数字,转十六进制格式(小)
%X -- 接收数字,转十六进制格式(大)
%e -- 接收数字,转科学计数法(小)
%E -- 接收数字,转科学计数法(大)
%f -- 接收数字,转浮点数格式
%g -- 接收数字,转%e或%f两者较短的一种
%G -- 接收数字,转%E或%f两者较短的一种
%q -- 接收字符串,转lua编译器可读入的格式
%s -- 就收字符串,转字符串格式;
-- 宽度:%6.3s 总6位显示3位(小数位可剪裁)
-- 对齐:默认右对齐,%添加-可以左对齐;
-- 匹配模式
. -- 任何字符配对
%a -- 字母配对
%c -- 控制字符配对
%d -- 数字配对
%l -- 小写字母配对
%p -- 标点配对
%s -- 空格配对
%u -- 大写字母配对
%w -- 字母数字配对
%x -- 十六进制数配对
%z -- 代表0的字符配对
%? -- ?配对,配对功能性字符和非字母字符 格式:%后跟 ^$()%.[]*+-?
-- 以上后跟‘+’(从1开始)‘*’(从0开始)配对多个空格截止,后跟‘-’时跟‘*’相反,后跟‘?’时,配对0个或1个
-- 上述字符大写,表示与该字符类以外的字符类配对
[%w_] -- 字母数字和下划线配对,用[]可匹配多个中括号中字符类
[^%w_] -- 非字母数字下划线配对;
%bxy -- 表示匹配从x字符开始到y字符结束
%f[set] -- 


-- lua迭代
-- 无状态迭代器
function mathod(iteratorMaxCount, currentNumber)
-- 执行内容
return currentNumber, currentNumber;-- 返回内容
end
for k, v in mathod, iteratorMaxCount, currentNumber -- mathod 方法名,iteratorMaxCount、currentNumber 为mathod方法的参数
do
-- 循环体
end


-- 多状态迭代器
array = {"Lua", "Tutorial"}
function elementIterator (collection)
   local index = 0
   local count = #collection
   -- 闭包函数
   return function ()
  index = index + 1
  if index <= count
  then
--  返回迭代器的当前元素
return collection[index]
  end
   end
end


for element in elementIterator(array)
do
   print(element)
end


-- lua中table的操作
table.concat(tableElement, sep, startIndex, endIndex); -- 打印tableElement表中从startIndex位置开始,到endIndex位置结束的所有内容,以sep分隔符分割;
table.insert(tableElement, index, value); -- 在tableElement表的index位置插入value值,index默认最后;
table.maxn(tableElement); -- 查找tableElement中key为整数的最大值并返回;
table.remove(tableElement, index); -- 删除tableElement表中的index位置的值,index默认最后删起;
table.sort(tableElement); -- 给tableElement升序排序;


-- lua的模块与包
-- require函数
local a = require('要加载的模块名'); -- 如果不在同一文件夹要写路径,a为重命名后的对象
-- 加载机制
-- require函数加载模块,从lua文件和c程序库中加载;
-- c包
loadlib(params1, params2);-- params1 库的绝对路径 params2 初始化函数
assert(loadlib);


-- lua元表(metatable)
-- __index元方法:
-- __newindex元方法:
-- 为表添加操作符:
-- __call元方法:
-- __tostring元方法:

-- lua的协同程序coroutine
-- 方法:create,resume,yield,status,wrap,running;


-- lua 文件I/O
-- 简单模式
file = io.open(filename, mode)-- mode值:r、w、a、r+、w+、a+、b、+
io.read(params)-- params值:*n、*a、*l、number
io.tmpfile();
io.type(file);
io.flush();
io.lines(optional file name)
-- 完全模式
file:read()
file:close()
file:seek(optional whence, optional offset)
file:flush()


-- lua 错误处理
-- 错误类型:语法错误、运行错误
--运行错误:assert(type(a) == "number", "a 不是一个数字")-- assert打印错误信息
-- error 函数
error(message, level);-- level:1默认,error位置(文件+行号) 2指出那个调用error函数的函数 0不添加错误位置信息
-- pcall(protected call)和xpcall、debug
if pcall(function_name, ...) then
-- 没有错误
else
-- 错误信息
end


-- lua 调试
-- lua调试中的函数
debug()
getfenv(object)-- 返回对象的环境变量
gethook(optional thread)
getinfo(thread, f, what)
debug.getlocal(thread, f, local)
getmetatable(value)
getregistry()
getupvalue(f, up)
sethook(thread, hook, mask, count)
setlocal(thread, level, local, value)
setmetatable(value, table)
setupvalue(f, up, value)
traceback(thread, message, level)
-- 调试类型
-- 命令行调试:RemDebug、clidebugger、ctrace、xdbLua、LuaInterface-Debugger、Rldb、ModDebug
-- 图形界面调试:SciTE、Decoda、ZeroBrane Studio、akdebugger、luaedit

-- lua垃圾回收
-- 自动内存管理机制
-- 有垃圾收集器收集死对象
-- 增量标记 - 扫描收集器,用来控制垃圾收集器的间歇和步进率
-- 垃圾回收函数
collectgarbage(opt, arg) -- opt:collect、count、restart、setpause、setstepmul、step、stop


-- lua面向对象
-- 封装、继承、多态、抽象
-- 创建对象
Rectangle = {k=v,k=v...}
function Rectangle:new (o,length,breadth)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  self.length = length or 0
  self.breadth = breadth or 0
  self.area = length*breadth;
  return o
end
-- 访问属性用‘.’(同java)
-- 访问成员函数‘:’ 例 objName:printArea()
-- 派生类的方法 printArea
function Rectangle:printArea ()
  print("矩形面积为 ",self.area)
end
-- 继承:利用setmetatable(obj1, obj2)
-- 函数重写
-- .与:的区别在于是否隐含self;


-- lua数据库的访问
-- 适应数据库:ODBC,ADO,Oracle,MySQL,SQLite,PostgreSQL
-- Window 下安装 LuaRocks:https://github.com/keplerproject/luarocks/wiki/Installation-instructions-for-Windows
-- MySQL链接 例:
require "luasql.mysql"
-- 创建环境对象
env = luasql.mysql()
-- 链接数据库
conn = env:connect("数据库名", "用户名", "密码", "ip地址", 端口)
-- 设置数据库的编码格式
conn:execute"SET NAMES UTF8"
-- 执行数据库操作
cur = conn:execute("select * from user")
row = cur:fetch({}, "a")
file = io.open("test.txt", "w+")
while row do
var = string.format("%d %s\n", row.id, row.name)
print(var)
file:write(var)
row = cur:fetch(row, "a")
end

file:close() -- 文件对象
conn:close() -- 数据库对象
env:close() -- 数据库环境对象


-- 结 --

猜你喜欢

转载自blog.csdn.net/u014259503/article/details/80829549