此文基于菜鸟教程lua教程,属于redis学习lua脚本前置内容,自己跟着执行并记录了一些问题,用于个人学习和备忘使用,深入了解请另寻其他资料
1. 安装(linux)
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install
2. 基本语法
2.1交互式编程
# lua -i
Lua 5.3.0 Copyright (C) 1994-2015 Lua.org, PUC-Rio
>
直接输入
> print("Hello World!")
回车,输出结果如下
> print("Hello World!")
Hello World!
>
2.2脚本编程
创建一个文件
#vi hello.lua
输入
print("Hello World!")
保存后执行
#lua hello.lua
Hello World!
2.3注释
单行注释
--注释内容
多行注释[[...]]表示把里面的内容当成一行,前面加上--,也就达到了多行注释的效果
--[[注释内容]]
如果你的注释内容本来就包含[[ 或者 ]] 这两个字符串,可以用如下写法
--[=[注释内容]=]
2.4标识符
变量以字母和下划线开头,不能以数字开头,不能使用特殊字符
lua区分大小写, hello和Hello是不同的两个变量
2.5保留字
and | break | do | else |
---|---|---|---|
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while | goto |
3.数据类型
类型 | 描述 |
---|---|
nil | 空值,只有值nil属于该类型,表示一个无效值(在条件表达式中相当于false)。 |
boolean | 包含两个值:false和true。 |
number | 默认为双精度类型double的实浮点数(默认类型可以修改 luaconf.h 里的定义) |
string | 字符串由一对双引号或单引号来表示 |
function | 由 C 或 Lua 编写的函数 |
userdata | 表示任意存储在变量中的C数据结构 |
thread | 表示执行的独立线路,用于执行协同程序 |
table | Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。 |
以下内容如无特别说明,都是交互式编程,要输入lua -i 后,再执行相应指令
3.1 nil 空
无效值,如打印不存在的变量a,便会输出nil,所有不存在或者未赋值的变量都是nil
>print(a)
nil
>print(b==nil)
true
>
给变量赋值nil等效于删除该变量
3.2 boolean 布尔
朴素的true和false,没啥说的,lua中把nil和false看做false,数字0是true
> if(0) then print("真的")else print("假的") end
真的
>
3.3 number 数字
Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:
print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))
执行结果
number
number
number
number
number
number
3.4 string 字符串
字符串由一对双引号或单引号来表示
string1 = "this is string1"
string2 = 'this is string2'
一块字符串,和前面注释相同,用[[字符串]]包裹起来即可,里面的内容会被当成一行,执行如下
> text=[[
>> 第一行
>> 第二行
>> 第三行]]
> print(text)
第一行
第二行
第三行
>
数字类型的字符串进行算术操作时会被转换成数字计算,
> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk
[C]: in ?
>
如果是单纯的字符串拼接,应该用..
> print("a" .. 'b')
ab
> print(157 .. 428)
157428
>
用#可以计算字符串长度,执行如下
> print(#"testString")
10
>
3.5 table 表
在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:
-- 创建一个空的 table
local tbl1 = {}
-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}
table是一个特殊的数组,他的下标可以是数字或者字符串,某个索引没有赋值则为nil
> a={}
> a["index"]="字符串作为索引"
> index=1
> print(a["index"])
字符串作为索引
> print(a[index])
nil
> a[index]=123
> print(a[index])
123
>
table没有固定长度大小,有新数据添加时table长度会自动增长
如果直接用#获取长度可能出现异常,长度计算源码位于ltable.c
文件下的```luaH_getn``函数
> print(a[1])
123
> return print(a["index"])
字符串作为索引
> a[1]=nil
> print(#a)
0
>
--如上,table中有两个元素,但是只返回了数字下标的总数,
字符串作为下标的没有计入长度,另外数组中多个值中部分为nil值,此时算出的长度更加没有规律,
所以计算长度要用for循环自己计数,暂时没找到可用官方api,自定义长度计算的函数如下,pairs是lua特有的迭代器,求长度时调用此函数即可
function table_leng(t)
local leng=0
for k, v in pairs(t) do
leng=leng+1
end
return leng;
end
不同于其他语言的数组,lua中table的默认起始下标不是0,而是1
3.6 function(函数)
函数既能单独写和使用,也可以作为变量传递后使用
-- function_test.lua 脚本文件
function factorial1(n)
if n == 0 then
return 1
else
return n * factorial1(n - 1)
end
end
print(factorial1(5))
--函数赋值给变量factorial2
factorial2 = factorial1
print(factorial2(5))
执行结果为
# lua function_test.lua
120
120
匿名函数,将函数作为参数传递后使用
-- function_test2.lua 脚本文件
function testFun(tab,fun)
for k ,v in pairs(tab) do
print(fun(k,v));
end
end
tab={key1="val1",key2="val2"};
--调用testFun时,第二个参数传递的是一个匿名函数,和上面一个例子其实差不多,只是这个函数没有在外面单独定义,而是作为匿名函数传递
testFun(tab,
function(key,val)--匿名函数
return key.."="..val;
end
);
3.7 thread(线程)
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
3.8 userdata(自定义类型)
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
网友评论