lua

Tecy 发布于 20 天前 60 次阅读


lua 设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

运行文件 lua filename.lua

注释

单行注释 --

-- 注释

多行注释 --[[]]

--[[
    多行注释
    多行注释
]]

数据类型

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

通过 type 可以获取类型。

print(type("Hello world")) --> string  
print(type(10))            --> number  
print(type(print))         --> function  
print(type(type))          --> function  
print(type(true))          --> boolean  
print(type(nil))           --> nil  
print(type(type(X)))       --> string

nil

nil 类型表示一种没有任何有效值。未初始化或不存在的量值为 nil

boolean

Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true。

if 0 then
    print("0 is true")
else
    print("0 is false")
end

-- 0 is true

number

Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义。

string

定义:

a = "string1"
b = 'string2'
c = [[string3]]

字符串拼接:

print(10 .. 25)     -- 1025
print("10" .. "25") -- 1025

算数操作:

print("10" + "25") -- 35
print("10" * "25") -- 250

table

在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{}。

创建:

a = {}
b = { "x", "y", "z" }

使用:

a = {}
a["x"] = 10
print(a["x"]) -- 10
print(a["y"]) -- nil
a["x"] = nil  -- 删除
print(a["x"]) -- 10

function

function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end

变量

lua 变量默认为全局变量,使用 local 声明局部变量。

function test()
    a = 5
    local b = 10
end

test()

print(a, b) // 5  nil

swap

x, y = y, x

循环

while

语法:

while (condition) do
    statement
end

示例:

x = 0
while (x < 10) do
    print(x)
    x = x + 1
end

for

语法:

for var = exp1, exp2, exp3 do
    statement
end

exp1 为初始值,exp2 为终止值,exp3 为步长。
等价于 C++ for(int var = exp1; var <= exp2; i += exp3)

示例:

for i = 0, 10, 2 do 
    print(i)
end
// 0 2 4 6 8 10 (注意含 10)

repeat until

语法:

repeat
    statement
until (condition)

conditiontrue 时退出循环。

示例:

x = 0
repeat
   print(x)
   x = x + 2
until (x > 10)

流程控制

语法:

if (condition) then
    statement
elseif (condition) then
    statement
else
    statement
end

注意 elseif 是连起来的。

示例:

x = 0
while (x < 10) do 
    if (x % 3 == 0) then
        print(x, "mod 3 is 0")
    elseif (x % 3 == 1) then
        print(x, "mod 3 is 1")
    else 
        print(x, "mod 3 is 2")
    end
    x = x + 1
end

函数

定义:

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end

函数支持多返回值和可变参数。

示例:

local function max(a, b)
    if (a > b) then
        return a
    else 
        return b
    end
end

print(max(1, 2)) // 2

可变参数

利用 ... 表示可变参数。

示例:

local function max(a, ...)
    local res = a
    for _, v in ipairs{...} do
        if (v > res) then
            res = v
        end
    end    
    return res
end

print(max(1, 2))
print(max(1, 2, 3))

可以将参数转变为表再操作(args = {...})。

运算符

下表列出了 Lua 语言中的常用算术运算符,设定 A 的值为10,B 的值为 20:

操作符描述实例
+加法A + B 输出结果 30
-减法A - B 输出结果 -10
*乘法A * B 输出结果 200
/除法B / A 输出结果 2
%取余B % A 输出结果 0
^乘幂A^2 输出结果 100
-负号-A 输出结果 -10
//整除运算符(>=lua5.3)5//2 输出结果 2

比较运算符:

操作符描述实例
==等于,检测两个值是否相等,相等返回 true,否则返回 false(A == B) 为 false。
~=不等于,检测两个值是否相等,不相等返回 true,否则返回 false(A ~= B) 为 true。
>大于,如果左边的值大于右边的值,返回 true,否则返回 false(A > B) 为 false。
<小于,如果左边的值大于右边的值,返回 false,否则返回 true(A < B) 为 true。
>=大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false(A >= B) 返回 false。
<=小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false(A <= B) 返回 true。

逻辑运算符:

操作符描述实例
and逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B。(A and B) 为 false。
or逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B。(A or B) 为 true。
not逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。

其他:

操作符描述实例
..连接两个字符串a..b ,其中 a 为 "Hello " , b 为 "World", 输出结果为 "Hello World"。
#一元运算符,返回字符串或表的长度。#"Hello" 返回 5

字符串

string.byte (s [, i [, j]])
返回 s[i], … , s[j] 的数值,i 从 1 开始,j 默认为 i

string.char (···)
将 … 数值变为字符串。

示例:

str = "abc0"

print(string.byte(str, 2, 4)) // 98 99 48

print(string.char(98, 99, 48)) // bc0

string.len (s)
返回 s 的字节数。

string.lower (s)
字符串全部转为小写字母。

string.upper (s)
字符串全部转为大写字母。

string.reverse (s)
字符串反转。

string.sub (s, i [, j])
返回字串。 i 从 1 开始, j 默认为 -1 表示到最后一个字符。

string.rep (s, n)
s 复制 n 遍。

-- 初始化表
mytable = {}

-- 指定值
mytable[1]= "Lua"

-- 移除引用
mytable = nil
-- lua 垃圾回收会释放内存

table.concat (list [, sep [, i [, j]]])
将 list[i], … , list[j] 连接起来并以 sep 分隔。
sep 默认为空串。i 默认为 1, j 默认为 #list

示例:

test = { "a", "b", "c" }

print(table.concat(test)) // abc
print(table.concat(test, " ")) // a b c
print(table.concat(test, " ", 2, 3)) // b c

table.insert (list, [pos,] value)
listpos 插入 valuepos 默认为最后。

示例:

test = { "a", "b", "c" }

table.insert(test, "e")
print(table.concat(test)) // a b c e

table.insert(test, 4, "d")
print(table.concat(test)) // a b c d e

table.remove (list [, pos])
删除 pos 处的值, pos 默认为最后。

table.sort (list [, comp])
tablecomp 排序。