LUA学习之语法

Lua [1]  是一个小巧的脚本语言,是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能,Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。一个完整的Lua解释器不过200k(5.0.2版的Lua的内核小于120KB,而Python的内核大约860KB,Perl的内核大约1.1MB,在所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

LUR控制硬件:http://www.eluaproject.net/overview

LUR语法:

  • 文件使用UTF8格式
  • lua解析语法时是采用空格等分割来解析的,某些情况下,若不小心加空格会导致非预期的结果。
  • 大小写敏感,下划线加大写默认系统保留;--单行注释;--[[   --]]用来多行注释
  • 关键字nil(不存在,或删除变量,使用 nil 作比较时应该加上双引号type(X)=="nil"),repeat,until,function,local,end
  • 8种数据类型,type函数来测试。

          2 个方括号 "[[]]" 来表示"一块"字符串:单引号,双引号,"[[]]"

  1. 对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字
  2. 字符串连接使用的是 "..";   (#str) 来计算字符串的长度.
  3. Lua 中的表(table){}其实是一个"关联数组"(associative arrays),lua数组的初始索引是1不是0
  4. 线程可以同时多个运行,而协程任意时刻只能运行一个

 

 Lua 变量有三种类型:全局变量(没有Local修饰)、局部变量(速度快,避免重复,建议多使用)、表(索引用[],当索引值为字符串时可简化为“,”)中的域。

赋值:可以对多个变量同时赋值,可以进行直接交互,或将函数的返回值依次赋值。

函数:有全局和局部(函数名前加local)之分,可以有多个返回值。可变参数:放在一个叫arg的表中,#arg 表示传入参数的个数

字符串操作函数:变大写,变小写,替换,链接,n个拷贝,查找,求长度,反转等

数组:一维或多维。

迭代器:Lua 默认提供的迭代函数 ipairs。

表:内部函数有插入/删除一个元素,排序,用字符分割或将元素链接)

模块与包:LUA从5.1加入了标准的模块管理机制,其实就是用一个Table输出,外部用require(table.val/table.func)调用

    1   对外输出的变量和函数前都加Table,不加的用local 修饰作为私有函数(不能对外输出,若想输出需再提供一个对外接口方法同前)

 1 -- 文件名为 module.lua
 2 -- 定义一个名为 module 的模块
 3 module = {}
 4 
 5 - 定义一个函数
 6 function module.func1()
 7     io.write("这是一个公有函数!\n")
 8 end
 9  
10 local function func2()
11     print("这是一个私有函数!")
12 end
13 
14 function module.func3()
15     func2()
16 end
17  
18 return module

View Code

    2  require调用,可以直接用原模块名,也可以起个新私有变量(建议这么做)   

-- test_module2.php 文件
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module")
 
print(m.constant)
 
m.func3()
View Code

   3 加载机制:

    require 用于搜索 Lua 文件的路径是存放在全局变量 package.path,以环境变量 LUA_PATH来初始化;或在当前用户根目录下打开 .profile 文件(没有则创建,打开 .bashrc 文件也可以),例如把 "~/lua/" 路径加入 LUA_PATH 环境变量里,如果找过目标文件,则会调用 package.loadfile 来加载模块。否则,就会去找 C 程序库。

   

#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"

source ~/.profile
 

   require 用于搜索 C文件的路径是存放在全局变量 package.cpath,以环境变量 LUA_CPATH来初始化;搜索的是 so 或 dll 类型的文件。如果找得到,那么 require 就会通过 package.loadlib 来加载它。

   C包在使用以前必须首先加载并连接(通过动态连接库机制),loadlib的函数内提供了所有的动态连接的功能(然而它并不打开库,可以用返回值打开它)(也就是说没有调用初始化函数)。这个函数有两个参数:库的绝对路径和初始化函数。

 二进制的发布库包含一个与前面代码段相似的stub文件,安装二进制库的时候可以随便放在某个目录,只需要修改stub文件对应二进制库的实际路径即可。

  将stub文件所在的目录加入到LUA_PATH,这样设定后就可以使用require函数加载C库了。

local path = "/usr/local/lua/lib/libluasocket.so"
-- 或者 path = "C:\\windows\\luasocket.dll",这是 Window 平台下
local f = assert(loadlib(path, "luaopen_socket"))
f()  -- 真正打开库

 协程:相当于一个带线程锁的调度线程,比如对于生产消费型的架构。

文件IO操作:简单模式(只操作一个文件输入输出,用io.func()),完全模式(同时操作多个文件输入输出,用file.func()),

错误处理:对于语法错误和运行错误,可以用assert(开销不小,请慎用) 和 error 来识别处理错误,用pcall 和 xpcall、debug(命令行,图形界面调试器,debug提供的一些函数)来输出错误。

function myfunction ()
   n = n/nil
end

function myerrorhandler( err )
   print( "ERROR:", err )
end

status = xpcall( myfunction, myerrorhandler )
print( status)

--结果
ERROR: test2.lua:2: attempt to perform arithmetic on global 'n' (a nil value)
false
View Code

 

垃圾回收:对赋值为nil的所有变量,Lua 运行了一个垃圾收集器来回收这些垃圾。

面向对象:对于封装,继承,多态,抽象为基本特征的面向对象:

  1. 类可以通过table + function模拟。类名使用帕斯卡命名法,变量名使用骆驼式命名法
  2. 继承,可以通过metetable模拟出来(不推荐用,只模拟最基本的对象大部分时间够用了)。Lua类设计时,用元表来实现oop,不要直接增加函数成员,因为直接增加函数成员会导致内存增加并且在jit下执行效率和用元表方式无差异。尽量减少表中的成员是另一个表的引用。 考虑lua的垃圾收集机制、内存泄露等。
  3. 创建对象:Table:new()
  4. 访问对象:属性(变量)用“。”,成员函数用“:”来访问,其实成员函数可以用点也可以用冒号,冒号只是起了省略第一个参数self的作用。
  5. 派生:先用基类创建新对象,再对新对象编写属性和方法。多态就是在派生类中对基类的同名函数重写。

数据库:通过操作库:LuaSQL接口来操作ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL等数据库,LuaSQL 可以使用 LuaRocks 来安装可以根据需要安装你需要的数据库驱动。

             Window 下安装 LuaRocks

            

 

 

 

    

View Code
posted on 2020-04-03 10:01  杰瑞鼠  阅读(465)  评论(0编辑  收藏  举报