怎么想到研究;lua了呢.无意间看到了一篇关于redis的文章,看到这么一句话,学会redis必须会lua
使用lua可以让你提高好几个逼格!!!
当时我还笑了笑.这不是吹牛逼吗!但是知道有一次看到朋友的项目里面有lua脚本,朋友说这个可以理解成redis的存储过程,可以实现复杂的业务逻辑,而且和redis的命令相比执行效率也快.
这是才意识到自己的无知!!!
决心必须搞定他,这才来到了lua的世界
才发现他是那么的强大,他可以连接mysql ,oracle ,odbc, ado sqlite,postgre 等等
最关键的是,redis可以直接调用这个,nginx也可以操作lua.而且大型的电商网站的三层缓存架构的第一层就是用lua和nginx做的
lua中的数据类型
有8中基本数据类型
- 设计目的
- 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
- lua特性
- 轻量级
- 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
- 可扩展
- Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
- 其它特性:
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
- 轻量级
- 应用场景
- 游戏开发
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
- 安全系统,如入侵检测系统
- 优点
- Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。
- Lua 函数主要有两种用途:
- 1.完成指定的任务,这种情况下函数作为调用语句使用;
- 2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
- 函数的定义
-
local function check_operated(userid, operate_code) function_body return params end
解析:- local:设置函数为局部函数需要使用关键字 local。
- check_operated: 指定函数名称。
- userid,operate_code 函数参数,多个参数以逗号隔开,函数也可以不带参数。
- function_body: 函数体,函数中需要执行的代码语句块。
- params: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开
- 实例
- 以下实例定义了函数 max(),参数为 num1, num2,用于比较两值的大小,并返回最大值
-
--[[ 函数返回两个值的最大值 --]] function max(num1, num2) if (num1 > num2) then result = num1; else result = num2; end return result; end -- 调用函数 print("两值比较最大值为 ",max(10,4)) print("两值比较最大值为 ",max(5,6))
- 以上代码执行结果为
- Lua 中我们可以将函数作为参数传递给函数,如下实例
-
■ myprint = function(param) print("这是打印函数 - ##",param,"##") end function add(num1,num2,functionPrint) result = num1 + num2 -- 调用传递的函数参数 functionPrint(result) end myprint(10) -- myprint 函数作为参数传递 add(2,5,myprint)
-
- 以上代码执行结果为:
-
■ 这是打印函数 - ## 10 ## ■ 这是打印函数 - ## 7 ##
-
- 多返回值
- Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil)
- 例如:
- s, e=string.find("www.runoob.com","runoob")
//返回
runoob在www.runoob.com中的下标
print
(
s
,
e
)
- 运行结果 5 10
- lua中的遍历数组中的最大值和最大值得下标
-
function maximum (a) local mi = 1 -- 最大值索引 local m = a[mi] -- 最大值 for i,val in ipairs(a) do if val > m then mi = i m = val end end return m, mi end print(maximum({8,10,23,12,5}))
-
- 可变参数
- Lua将函数的参数放在一个叫arg的表中,#arg 表示传入参数的个数。
- 例如我们计算几个数的平均值:
-
function average(...) result = 0 local arg={...} for i,v in ipairs(arg) do result = result + v end print("总共传入 " .. #arg .. " 个数") return result/#arg end print("平均值为",average(10,5,3,4,5,6)) 以上代码执行结果为: 总共传入 6 个数 平均值为 5.5
lua 还有表的概念:
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。
Table 操作
字符串操作
字符串格式化
Lua 提供了
string.format()
函数来生成具有特定格式的字符串, 函数的第一个参数是格式 , 之后是对应格式中每个代号的各种数据。
由于格式字符串的存在, 使得产生的长字符串可读性大大提高了。这个函数的格式很像 C 语言中的 printf()。
以下实例演示了如何对字符串进行格式化操作:
格式字符串可能包含以下的转义码:
- %c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
- %d, %i - 接受一个数字并将其转化为有符号的整数格式
- %o - 接受一个数字并将其转化为八进制数格式
- %u - 接受一个数字并将其转化为无符号整数格式
- %x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
- %X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
- %e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
- %E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
- %f - 接受一个数字并将其转化为浮点数格式
- %g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
- %q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
- %s - 接受一个字符串并按照给定的参数格式化该字符串
为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:
- (1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
- (2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
- (3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
- (4) 宽度数值
- (5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.
例如:
Lua中的thread(线程)
在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
Lua 中的循环
http://blog.youkuaiyun.com/qq_38665235/article/details/78364441
欢迎转载请注明出处!!!