lua
基础
用 C 语言编写,编译后仅仅100k左右,方便嵌入到其他程序中。
参考教程
执行方式
lua helloWorld.lua
./hello.lua
语法
文件头
#!/user/local/bin/lua
注释
--单行注释
--[[
多行注释
--]]
变量
-- local 表示局部变量,作用域到 end 为止,不写 local 表示全局变量
local a
print(type(a)) --结果为 nil,lua 中用 nil 表示空
type(a) == nil --结果为 false
type(a) == "nil" --结果为 true
--字符串操作
len = "www.run" .. "oob.com"
print(#len) --结果为14
--定义表(类似PHP array),以及遍历元素,tab1会自动排序,返回顺序和赋值顺序不同
--lua索引默认从 1 开始
local tab1 = { key1 = "val1", key2 = "val2", "val3" }
--nil可以用于删除元素,经过下面的操作,重新打印将不再显示 key1
tab1.key1 = nil
遍历表
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
--其中 pairs 是迭代器,迭代中涉及迭代函数(获取下一个值的函数),状态常量(数组),控制变量(变量的index)。
--无状态迭代器,通过状态常量和控制变量获取下一个数组的值,并返回更新的控制变量
--多状态迭代器,将数组作为迭代器的状态常量,所有信息存储在其中,利用闭包函数进行迭代。
--闭包函数是将函数 A 的返回值设置为一个函 数B,函数 B 继续保持着对于函数A中定义的变量的引用,从而实现迭代
条件语句
--if 语句
if false or nil then
print("至少有一个是 true")
else
print("false 和 nil 都为 false!")
end
函数
--local表示局部函数,否则默认全局
local function factorial1(n)
if n == 0 then
return 1
else
--可以返回多个值,使用 , 分隔,如果接收的多于返回的用nil填充,少于时返回的会被丢掉
return n * factorial1(n - 1)
end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5)) --可以存在变量中,然后调用
--可变参数函数
function average(...)
local arg={...} --> arg 为一个表,局部变量
local argNum = select("#",...)
local argN_Num = select(n, ...)
end
print("平均值为",average(10,5,3,4,5,6))
函数库
定义一个包,相当于C语言中的库,但是实际上就是一个table,使用 require(“module”)的方式调用
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = "这是一个常量"
-- 定义一个函数
function module.func1()
io.write("这是一个公有函数!\n")
end
require
require 用于搜索 Lua 文件的路径
搜索路径存放在全局变量 package.path 中,当 Lua 启动后,会以环境变量 LUA_PATH 的值来初始这个环境变量。如果没有找到该环境变量,则使用一个编译时定义的默认路径来初始化。
当然,如果没有 LUA_PATH 这个环境变量,也可以自定义设置,在当前用户根目录下打开 .profile 文件(没有则创建,打开 .bashrc 文件也可以),例如把 “~/lua/” 路径加入 LUA_PATH 环境变量里:
#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"
文件路径以 “;” 号分隔,最后的 2 个 “;;” 表示新加的路径后面加上原来的默认路径。
接着,更新环境变量参数,使之立即生效。
source ~/.profile
面向对象
-- 元类
Shape = {area = 0}
-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end
-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()
调用其他语言库
LuaJIT 在传统的 Lua C API 之外,额外提供 FFI 的方式来调用 C 函数,更是大大提升了跟 C 交互的便利度。
FFI 全称是 Foreign Function Interface