Lua学习笔记一

PS:由于公司项目中用到Lua,所以准备学习一下,这里做下学习笔记。

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

基本语法

交互式编程

lua -i 进入交互式编程

脚本式编程

新建一个hello.lua文件,将lua代码写在hello.lua中

print("Hello world")

执行:

lua hello.lua

结果:

Hello rorld

也可以将代码改为如下形式:

1  
2  
#!/usr/local/bin/lua  
print("Hello world")  

—|—

执行:

./hello.lua

结果和上面一样。

这种模式称为脚本式编程。

注释

单行注释:

--

多行注释:

1  
2  
3  
4  
	多行注释  
	多行注释  
--]]  

—|—

标识符

以字母或者下划线_开头,后面加上0个或多个字母,下划线,数字。(标识符区分大小写)

关键字

and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while      

Lua变量

  • 全局变量 -默认申明的都是全局变量,除非申明为局部变量
  • 局部变量-指定为local时
  • 表字段-特殊变量,可以保存除了nil之外的任何内容,包括函数

变量定义

格式:

type variable_list

示例:

1  
2  
local i,j  
local a  

—|—

变量初始化:

type variable_list = value_list

示例:

1  
2  
3  
4  
5  
6  
local a,b = 10,20  
print("a:",a)  
print("b",b)  
b,a = a,b  
print("a:",a)  
print("b:",b)  

—|—

结果:

1  
2  
3  
4  
5  
a:	10  
b:	20  
------  
a:	20  
b:	10  

—|—

Lua数据类型

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua中的值类型有八种:

数据类型 描述
nil 无效值,没有被赋值,条件表达式中为false
boolean false和true
number 双精度类型的实浮点数
string 字符串,单引号或双引号内
function 表示C或者Lua编写的函数
userdata 表示C语言数据结构
thread 表示独立的执行线程,它用于实现协同程序
table 表示普通数组,符号表,集合,记录,图形,树等,并实现关联数组。 它可以保存任何值(除了nil)
1  
2  
3  
4  
5  
6  
7  
print(type("Hello world"))    --string  
print(type(123))              --number  
print(type(print))			  --function  
print(type(type))			  --function  
print(type(true))			  --boolean  
print(type(nil))			  --nil  
print(type(type(X)))		  --string  

—|—

运行结果:

1  
2  
3  
4  
5  
6  
7  
string  
number  
function  
  
boolean  
nil  
string  

—|—

nil

nil 表示无效值,如一个没有被赋值的变量

1  
2  
print(type(a))  
结果是 nil  

—|—

对于全局变量和 table,nil 还有一个”删除”作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉

1  
2  
3  
4  
5  
6  
7  
8  
9  
tab = {key1 = "val1",key2 = "val2","val3"}  
for k,v in pairs(tab) do  
	print(k.."---"..v)  
end  
print("-------------")  
tab.key1 = nil  
for k,v in pairs(tab) do  
	print(k.."---"..v)  
end  

—|—

结果:

1  
2  
3  
4  
5  
6  
1---val3  
key1---val1  
key2---val2  
-------------  
1---val3  
key2---val2  

—|—

type(type(x)) 结果是string

type(x) == nil 结果是false

type(x) == “nil” 结果是true

boolean

boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是”假”,其他的都为”真”

number

Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)

string

字符串由一对双引号或单引号来表示

1  
2  
string1 = "hello world"  
string2 = 'hello world2'  

—|—

也可以用[[]]表示一块字符串

1  
2  
3  
4  
5  
6  
7  
8  
html = [[  
  <html>  
<head></head>  
<body>  
    <a href="http://www.baidu.com/">百度</a>  
</body>  
</html>  
]]  

—|—

在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:

1  
2  
3  
4  
print("1" + 1)  
print("1" + "1")  
print("1+1")  
print("Hello" + 1)  

—|—

结果:

1  
2  
3  
4  
5  
2.0  
2.0  
1+1  
lua: /Users/wufei/project/lua_workspace/data_type.lua:36: attempt to perform arithmetic on a string value  
stack traceback:  

—|—

“Hello” + 1 执行报错

字符串的拼接用 ..

1  
2  
print("a" .. "b")  
print(123 .. 456) --数字和.. 之间一定要有空格,不然会报错  

—|—

使用#来计算字符串长度

print(#"hello world")

结果为:11

table(数组,字典 )

table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:

pairs 遍历所有元素 字典无序

ipairs 只能遍历数组,不能遍历字典类型,只能遍历没有key的元素

1  
2  
local table1 = {}			--方式一  
local table2 = {"a","b","c","d"}  

—|—

Lua的table是一个”关联数组”,数组的索引可以是数字或者是字符串

1  
2  
3  
4  
5  
6  
7  
8  
a = {}  
a["key"] = "value"  
key = 1  
a[key] = 2  
a[key] = a[key] + 1  
for k,v in pairs(a) do  
  print(k..":"..v)  
end  

—|—

结果:

1  
2  
1:3  
key:value  

—|—

Lua 数组默认索引从1开始:

1  
2  
3  
4  
local table = {"a","b","c"}  
for key,value in pairs(table) do  
  print("key",key)  
end  

—|—

结果:

1  
2  
3  
key	1  
key	2  
key	3  

—|—

table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil

1  
2  
3  
4  
5  
6  
7  
local table = {}  
for i = 1,10 do  
  table[i] = i  
end  
table["key"] = "value"  
print(table["key"])  
print(table["a"])  

—|—

结果:

1  
2  
value  
nil  

—|—

因为key为a的元素没有初始化,所以为nil

table 的长度和字符串长度一样,用#来获取:

print(#table)

function

Lua中,函数是被看作是”第一类值(First-Class Value)”,函数可以存在变量里:

1  
2  
3  
4  
5  
6  
function test(a)  
	print("test:"..a)  
end  
test(1)  
test2 = test  
test2(2)  

—|—

结果:

1  
2  
1  
2  

—|—

function 可以以匿名函数的方式通过参数传递:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
function testFun(tab,fun)  
	for k,v in pairs(tab) do  
		print(fun(k,v))  
	end	  
end  
  
local tab = {k1 = "v1",k2 = "v2"}  
testFun(tab,  
function(k,v)  
	return k.."="..v  
end  
)  

—|—

结果:

1  
2  
k2=v2  
k1=v1  

—|—

thread

lua中,最主要的线程是协同程序

userdata

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

运算符

  • 算术运算符

  • 关系运算符

  • 逻辑运算符

  • 其他运算符

算术运算符

1  
2  
3  
4  
5  
6  
7  
+  加法运算  
-	 减法运算  
*  乘法运算  
/  除法运算  
%  取模运算  
^  指数运算  
-  取负  

—|—

关系运算符

1  
2  
3  
4  
5  
6  
==  
~=  不等于  
>  
<  
>=  
<=  

—|—

逻辑运算符

1  
2  
3  
and  
or  
not  

—|—

其他运算符

1  
2  
..  字符串拼接  
#   取字符串或者table的长度  

—|—

参考资料:

http://www.runoob.com/lua/lua-tutorial.html

糖果

糖果
LUA教程

Lapis框架的常用处理方法

Lapis框架的常用处理方法 Continue reading

MoonScript实现选择排序

Published on February 26, 2017

MoonScript与Redis客户端

Published on January 19, 2017