1、命令行模式下lua的运行
执行lua,进入交互式命令行,ctrl+d os.exit()退出命令行。
-l指定运行chunk的先后顺序,-l选项会调用require,将会在指定的目录文件下搜索。
调试或者测试lua代码:
-i要求lua运行指定chunk后进入交互模式(意思是接下来可以继续在交互模式下操作而-l运行一次后直接退出)
命令行中使用dofile函数连接外部的chunk,dofile函数加载文件并执行。(方便测试函数功能)
2、命令模式下创建和删除全局变量
给一个变量赋值为非nil,该变量即为一个全局变量。删除时赋值为nil.
3、lua的命令行方式
lua -e "cmd"
设置交互模式的提示符:lua -i -e "_PROMPT=' lua> '"
lua [options] [script [args]]
lua -e "sin=math.sin" script a b
全局变量arg存放lua的命令行参数(结合用户栈的组织结构)
lua使用所有参数构造arg表,arg[0]存储脚本名 脚本参数从1开始存储,脚本前面的参数从-1开始存储
arg[-3]="lua"
arg[-2]="-e"
arg[-1]="sin=math.sin"
arg[0]="script"
arg[1]="a"
arg[2]="b"
lua通过配置来设置交互模式的环境,可以加载包,修改提示符和路径,定义自己的函数,修改或者重命名函数:
在运行参数之前lua会查找环境变量LUA_INIT的值,如果存在且为@filename,lua将加载指定文件,如果存在但不是以@开头,lua假定filename为lua代码并运行。
4、动态语言lua中的8个基本类型:
nil 为初始化的变量都是这个类型
boolean true false--[[false和nil为假,其余都为真,0和空串都是真--]]
number --[[int float double long都属于--]]
string --[[char char*都属于--]]
userdata
function print() type()--[[type()的返回类型为string 函数也可以赋值给变量,之后可以用该变量代替该函数--]]
thread
table
5、
lua中字符串是不可以被修改的,可以使用string的相关方法获取到string的部分值保存在新的变量中。string对象由lua自动进行内存的释放和分配。
相关的字符转义
\ddd方式可以表示字母 \最多可以将3个数字转义
使用[[...]]表示字符串,用来包含一段代码很方便,这种形式的字符串可以包含多行,可以嵌套且不会解释转义序列。
6、lua中的隐式类型转换
当一个字符串使用算术操作符时,string会转成数字(当然可以转换成功的仅限于数字字符串)
当lua期望string但却碰到数字时,会将数字转成string ..在lua中时字符串连接符,当在数字后面写..时,必须加上空格防止被解释错。
7、显示类型转换
tonumber()显示将string转换为数字,string不是正确的数字时返回nil tostring()显示将数字转换为string
8、
functions和其他变量相同,函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值
9、运算符
lua通过引用比较tables userdata
functions(当且仅当两者表示同一个对象时相等,即使两个对象的值相等但若是构造的两个对象则他们不等)
–[[重点–]]
10、表的构造
- lua中的数组实际存储数据是从1小标开始的,0下标的数据是nil
- 构造器是创建和初始化表的表达式,最简单的构造函数是{},用来创建一个空表。
- 表的几种初始化方法:
- 使用[expression]显示的表示将被初始化的索引 opnames = {["+"] = "add",
["-"] = "sub",
["*"] = "mul",
["/"] = "div",
}
- record初始化:
a = {x=0, y=0} <==> a = {}; a.x=0;a.y=0
- 混合列表和record初始化:
polyline = {color="blue",thickness=2,npoints=4,
{x=0,y=-5} --polyline[1]
{x=-10,y=0}
{x=-8,y=3}
{x=5,y=5}
}
- list初始化和record初始化的比较:
{x=0,y=0} <==> {["x"]=0,["y"]=0}
{"red","green","blue"} <==> {[1]="red",[2]="green",[3]="blue"}
http://wiki.jikexueyuan.com/project/lua/tables.html lua教程
一个表可以被不同的变量引用,一个变量也可以随时改变所引用的表对象。
10、基本语法
- 多值赋值(变量列表和值列表):
常用来交换变量,或者函数调用返回多个值给多个变量
x, y = y, x
a, b = f()
当变量的个数和值的个数不一致时:若值个数不够则补nil 若变量的个数不够多余的值被忽略
- 局部变量与代码块:
local定义一个局部变量,该局部变量的生命周期在代码块内(控制结构、函数体、chunk)
do ... end 相当于c/c++中的{}
局部变量:避免命名冲突、访问局部变量的速度比全局变量快
- for循环:
数值for循环
for i=10,1,-1 do --初始值,终止值,步进(默认为1)
print(i)
end
初始值,终止值,步进 只在循环开始前计算一次
控制变量自动被声明为局部变量,只在循环内有效
范围型for循环
/***************************************************/
与迭代器有关,注意使用pairs()和ipairs()函数
/***************************************************/
11、函数
lua中函数调用形式
例外情况(当函数只有一个参数并且这个参数是字符串或者表构造的时候,()可有可无) print "hello world" <==> print("hello world") dofile 'a.lua' print('a.lua') print [[a multi-line message]] print([[a multi-line message]]) f{x=10, y=20} f({x=10, y=20}) type{} type({}) lua也提供面向对象方式调用函数o:foo(x) o.foo(o.x) - lua中函数实参与形参的匹配方式 多余部分被忽略,缺少部分用nil补足。 - lua函数中多值返回 在return后列出返回值列表可以返回多个值 - 发生函数调用的几种情况: 函数调用作为表达式 1、函数调用是表达式的最后一个参数(最右边的)或者表达式仅有一个参数时,根据变量的情况尽可能的返回多个值,不足补nil,超出舍去 2、其他情况只返回第一个返回值 函数调用作为函数参数时: 与多值赋值相同 函数调用在表构造函数中初始化时: 与多值赋值相同 可以使用圆括号强制使调用返回一个值 - lua中特殊函数unpack 该函数接受一个数组作为参数,返回数组中的所有元素 unpack被用来实现泛型调用机制,例如调用可变参数的可变函数: f = string.find a = {"hello", "ll"} print(f(unpack(a))) - lua中的可变参数: lua将函数的参数放在arg表中,arg表中有一个域n表示参数个数。 pr = "" function pf(...) for key,value in iparis(arg) do pr = pr .. tostring(value) .. "\t" end pr = pr .. "\n" print(pr) print(arg.n) end 亚元(不用的变量起到占位的作用) local _, x = string.find(s,p)
对arg表的应用
function select(n, ...) return arg[n] end print(string.find("hello hello","hel")) print(select(1,string.find("hello hello","hel"))) --[[arg[1]--]] print(select(2,string.find("hello hello","hel"))) --[[arg[2]--]]
命名参数(个人的理解是实现类似c++中默认参数的功能)
setPosition(x=1, y=2) --[[在lua中是不合语法的--]] function setPosition(point) then print(point.x, point.y) end setPosition({x=1, y=2})