lua脚本的初探

怎么想到研究;lua了呢.无意间看到了一篇关于redis的文章,看到这么一句话,学会redis必须会lua


使用lua可以让你提高好几个逼格!!!


当时我还笑了笑.这不是吹牛逼吗!但是知道有一次看到朋友的项目里面有lua脚本,朋友说这个可以理解成redis的存储过程,可以实现复杂的业务逻辑,而且和redis的命令相比执行效率也快.


这是才意识到自己的无知!!!


决心必须搞定他,这才来到了lua的世界


才发现他是那么的强大,他可以连接mysql  ,oracle ,odbc, ado sqlite,postgre  等等


最关键的是,redis可以直接调用这个,nginx也可以操作lua.而且大型的电商网站的三层缓存架构的第一层就是用lua和nginx做的


lua中的数据类型


有8中基本数据类型


数据类型
描述
nil
这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean
包含两个值:false和true。
number
表示双精度类型的实浮点数
string
字符串由一对双引号或单引号来表示
function
由 C 或 Lua 编写的函数
userdata
表示任意存储在变量中的C数据结构
thread
表示执行的独立线路,用于执行协同程序
table
Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

  • 设计目的
    • 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
  • 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还有函数

  • 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 操作

序号
方法 & 用途
1
table.concat (table [, sep [, start [, end]]]):
concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。
2
table.insert (table, [pos,] value):
在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.
3
table.maxn (table)
指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。( Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现 )
4
table.remove (table [, pos])
返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。
5
table.sort (table [, comp])
对给定的table进行升序排序。

字符串操作
序号
方法 & 用途
1
string.upper(argument):
字符串全部转为大写字母。
2
string.lower(argument):
字符串全部转为小写字母。
3
string.gsub(mainString,findString,replaceString,num)
在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:
> string . gsub ( "aaaa" , "a" , "z" , 3 );
zzza     3
4
string.find (str, substr, [init, [end]])
在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。
> string . find ( "Hello Lua user" , "Lua" , 1 )
7      9
5
string.reverse(arg)
字符串反转
> string . reverse ( "Lua" )
auL
6
string.format(...)
返回一个类似printf的格式化字符串
> string . format ( "the value is:%d" , 4 )
the value is : 4
7
string.char(arg) 和 string.byte(arg[,int])
char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。
> string . char ( 97 , 98 , 99 , 100 )
abcd
> string . byte ( "ABCD" , 4 )
68
> string . byte ( "ABCD" )
65
>
8
string.len(arg)
计算字符串长度。
string . len ( "abc" )
3
9
string.rep(string, n)
返回字符串string的n个拷贝
> string . rep ( "abcd" , 2 )
abcdabcd
10
..
链接两个字符串
> print ( "www.runoob" .. "com" )
www . runoobcom
11
string.gmatch(str, pattern)
回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。
> for word in string . gmatch ( "Hello Lua user" , "%a+" ) do print ( word ) end
Hello
Lua
user
12
string.match(str, pattern, init)
string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。 
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。
> = string . match ( "I have 2 questions for you." , "%d+ %a+" )
2 questions

> = string . format ( "%d, %q" , string . match ( "I have 2 questions for you." , "(%d+) (%a+)" ))
2 , "questions"

字符串格式化

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 中的循环
循环类型
描述
在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true。
重复执行指定语句,重复次数可在 for 语句中控制。
重复执行循环,直到 指定的条件为真时为止
可以在循环内嵌套一个或多个循环语句(while do ... end;for ... do ... end;repeat ... until;)
Lua 中的流程控制
语句
描述
if 语句  由一个布尔表达式作为条件判断,其后紧跟其他语句组成。
if 语句  可以与  else 语句 搭配使用, 在 if 条件表达式为 false 时执行 else 语句代码。
你可以在 if  或  else if 中使用一个或多个  if  或  else if  语句 。
看到lua的强大之处了吧,哎只恨知己知道的太晚了,关于redis如果操作lua 将在下篇文章 redis与lua的结合使用中分析
http://blog.csdn.net/qq_38665235/article/details/78364441
欢迎转载请注明出处!!!

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值