1. Lua 是一个小巧而简单的语言。
Lua很容易与传统的C/C++整合,Lua以来C语言完成性能,底层操作以及第三方软件的接口。Lua提供了C所不擅长的,高级语言,动态结构,简洁,抑郁测试与调试。
Lua是一种易于扩展的语言,也是一种易整合语言。
Lua特点:
可扩展性:Lua扩展性很好,可以通过Lua代码或C代码扩展,Lua很多功能通过外部库来扩展。
简单: Lua本身简单,小巧,内容少但功能强大,易于实现小的应用。
高效:Lua有很高的执行效率
与平台无关:几乎可以运行在所有的系统上,Lua不是通过条件编译实现平台无关,完全使用ANSI C,只要有ANSI C编译器就可以编译并使用Lua。
Lua应用场景:
使用Lua嵌入在应用程序中。
作为一种独立运行的语言,用于文本处理或者只运行一次的小程序
使用其他语言开发,把Lua当做库使用,使用C语言开发,但使用Lua简历简单灵活易于使用的接口
2. 起点
print("Hello World");
function fact(n)
if n == 0 then
return 1;
else
returnn*fact(n-1);
end
end
print("enter a number:");
a = io.read("*number");
print(fact(a));
5
Hello World
enter a number:
120
Lua中的Chunks,交互模式下,一般是一行为一个Chunk,还可以是一个函数,MByte的Chunk也很常见。
全局变量:全局变量不需声明,给一个变量赋值即创建这个全局变量,没有初始化的全局变量初始化为nil
and break do else elseif end false for function if in local nil not or repeat return then true until while
Lua大小写敏感,单行注释 -- 多行注释–[[ --]]
--[[
print(10) -- no action(comment)
--]]
命令行方式: lua [options] [script [args]]
prompt>lua –e “print(math.sin(12))” à
全局变量里面存储了命令行参数,
3. 类型和数值
Lua是动态类型语言,变量不要类型定义。8个基本类型为:nil,boolean,number,string,userdata,function,thread,table。
type可以测试给定变量或值得类型:
print(type(“Hello world”))
print(type(10.4 * 3))
print(type(print))
print(type(type))
print(type(true))
print(type(nil))
print(type(type(X)))
Nil是Lua中特殊的类型,全局变量没有被赋值以前默认为nil。
Booleans可以取false和true,可以作为条件。在控制结构中,除了false和nil为假以外,其他都为真,包括0和空串为真
Numbers表示实数,Lua中没有整数。
Strings指字符的序列。Lua是8位字节,字符串可以包含任何字符,但是Lua中字符串不可以修改,只能创建一个新的变量存放字符串。可以使用单引号或者双引号表示字符串
a= “a line”
b= ‘anthor line’
为了统一风格使用一种,当表示嵌套时才使用两种,对于含有引号情况使用转义符\
\a bell \b 后退 \f 换页 \n 换行 \r 回车 \t 制表符 \’ 单引号 \” 双引号
[[… ]]表示字符串,可以包含多行,也可以嵌套不会解释转义序列。
Lua会在string和numbers之间自动进行类型转换,使用算术操作符,string自动转为数字。
print(“10” + 1) print(“10 + 1”) print(“-5.3e-10” * “2”)
“..”在Lua中是字符串连接符,其前后最好加空格,防止解释错误。
n = tonumber(line)
if n == nil then
error( line .. "isnot a valid number");
else
print( n * 2);
end
数字与字符串之间的转换: tonumber() tostring()
Functions函数式第一类值,意味着函数可以存储在变量中,可以作为函数的参数,也可以作为返回值。
Lua可以调用lua或C实现的函数,Lua所有标准库都是用C实现的,标准库包括string库,table库,I/O库,OS库,算术库以及debug库。
Userdata和Threads:userdata可以将C数据存放在Lua变量中,userdata在Lua中除了赋值和相等比较外没有预定义的操作。Userdata用来描述应用程序或使用C实现的库创建的新类型。
4. 表达式:
Lua中表达式包括数字常量,字符串常量,变量,一元和二元运算符,函数调用以及非传统的函数定义和表构造。
算术运算符: + - * / ^
关系运算符: < > <= >= == ~=
其中,nil只和自己相等,对于tables,userdata和functions的比较,仅当两者表示同一个对象时相等。
逻辑运算符:and or not
逻辑运算符认为false和nil为假,其他的都为真,0也是true。
and和 or的运算都是运算截断的,对于and,只要前面式子为假,则不计算后面式子,对于or则是相反,只要第一个参数为真,不再计算第二个参数。
C语言的三元运算符:a ? b: c 可以用这个语句实现: (a and b) or c;
链接运算符: .. 连接两个字符串
运算符的优先级:
^
not - (unary)
* /
+ --
..
< > <= >= ~= ==
and
or
表的构造:
构造器是创建和初始化表的表达式,表是Lua特有的功能强大的东西。{}构造空表,可以初始化数组:days={“Sunday”, “Mondy”,“Tuesday”, “Wednesday”, “Thursday”}
初始化表为record: a = { x = 0, y = 0}
不管用何种方式创建table,可以向表中添加或者删除任何类型的域,构造函数仅影响表的初始化。
创建一个链表:
list= nil
forline in io.lines() do
list= { next = list, value = line};
end
这样就创建了一个链表。
一个构造函数中可以混合列表风格和record风格进行初始化:
polyline= { color = “blue”, thickness = 2, npoints = 2,
{x = 0, y = 0}
{x = -10, y = 0}
{x = -100, y = 1}
{x = 0, y = 1}
}
另一种更一般的初始化方式,用[expresson]显示的表示将被初始化的索引: