Lua学习

简介

  • Lua是脚本型语言
    • 动态编译
    • 动态执行
      • 每次修改不需要重新编译链接执行
    • 运行时编译而并非运行前编译
  • 是C语言编写的
  • 速度比C语言快

特性

Lua的Hello World

1  
print("Hello world")  

—|—

Lua行末不要分号

Lua的括号

1  
2  
3  
4  
5  
do  
    ……  
    ……  
    ……  
end  

—|—

Lua语言几乎用不到大括号,取而代之的是do…end

Lua的注释

1  
2  
3  
4  
5  
6  
7  
8  
9  
// 双斜杠不是注释了哦  
  
--[[  
这是一个多行注释哦  
]]  
/*  
 这不是多行注释了哦  
*/  

—|—

小心不要变成纯文本了

1  
2  
3  
4  
5  
--如果上面的多行注释没有写 双横线的话,就变成的纯文本赋值语句哦  
  
a = [[<html><head></head><body></body></html>]]  
  
-- 这个时候的 a 就是一个纯文本  

—|—

数据类型

  • Lua是动态类型,不需要定义就可以直接使用

    1
    2

a = "I'm a"  
print("a is "..a)  

—|—

  • Lua的数据类型是动态可变的

  • Lua的数据类型

    • 数字类型
      • 整型
      • 浮点型
      • long double 等 都是 数字类型,并没有明确划分
    • 字符串类型
    • thread类型
      • 线程也算是一个数据类型
    • function类型
      • 函数方法的数据类型
    • table
      • 数组,融合的链表和键值对等
    • 其他类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

a = function(x)  
    print("user input is "..x)  
end  
  
a("test")  
-- 这就相当于调用了function(x) 那个函数  
  
-- 唯一一个使用了 大括号的地方  
myTable = {12,13}  
print(myTable) -- 会输出table的地址  
for k,v in pairs(myTable) do  
    print(k,v)  
end  
-- 输出了序列号和对应的值(序号从1开始)  

—|—

变量作用域

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
b = "123"  
local c = 12  
  
local function ()  
    print("i'm lua")  
end  
  
  
local function myfuntion2()  
  	local a = "hello"  
    return a  
end  

—|—

  • 其他lua文件引用该lua文件的时候,将无法访问到local标记的变量
  • 相当于 是一个 private 的变量
  • 反之 如果不加 local标识符,那么Lua默认的是全局变量global类型

如果一个function函数中创建的变量不是local的,就意味着它是一个global变量

if语句(没有switch语句)

  • 单独一个if

    1
    2
    3
    4

local a = 12  
if a == 12 then  
	print("a's value is 12")  
end  

—|—

  • if..else 语句

    1
    2
    3
    4
    5
    6

local a = 2  
if a == 2 then  
    print("value is 12")  
else   
    print("value is not 12")      
end  

—|—

  • if…else if…语句

    1
    2
    3
    4
    5
    6

local a = 12  
if a == 12 then   
    print("value is 12")  
    elseif a ~= 11 then  
    print("value is not 11")  
end  

—|—

这里不等于符号是~= 注意注意!!!!!

函数/方法

无参无返回值

1  
2  
3  
local function f1()  
    print("hello")  
end  

—|—

有参无返回值

1  
2  
3  
local function f2(a)  
    print(a)  
end  

—|—

有参有返回值

1  
2  
3  
4  
5  
6  
7  
local function f3(a)  
    a += 2  
	return a  
end  
  
--调用  
a = f3(123)  

—|—

返回多个值

1  
2  
3  
4  
5  
6  
local function f4()  
    return 1,2  
end  
  
-- 调用  
local a,b = f4()  

—|—

可变参数列表

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
local function f5(...)  
    local myTable = {...}  
      
    for k,v in pairs(myTable) do  
        print(k,v)      
    end  
end  
  
-- 调用  
f5("12",123,"ok")  

—|—

库函数

  • print() 就是一个很明显的print(),因为我们没有定义它
  • 有些函数是Lua自带的

逻辑操作符

1  
and or not  

—|—

  • 表示假
    • false
    • nil
  • 表示真
    • 0
    • 其他数值
and 和 or 就类似于 C语言中的 && 和  
  • and
    • 如果我们第一个需要去计算的操作数,如果操作数是假,则返回第一个操作数
    • 反之则返回第二个操作数

    1
    2
    3
    4

print(1 and 2)  
-- 输出的 2 哦  
print(false and 5)  
-- 输出 false 哦  

—|—

  • or
    • 如果第一个我们需要去计算你的操作数为真,返回第一个值
    • 反之返回第二个值

    1
    2
    3
    4

print(1 or 5)  
-- 返回 1  
print(false or 5)  
-- 返回 5  

—|—

not 类似于 C语言的 ! 取反

  • not
    • 永远返回的是 true或false

    1
    2
    3
    4

print( not nil)  
-- 返回 true  
print( not 1)  
-- 返回 false  

—|—

循环语句

while

1  
2  
3  
4  
5  
6  
local index = 1  
local mytable = {1,2,3}  
while mytable[index] do   
    print(mytable[index])  
    index = index+1  
end  

—|—

do……while换成了 repeat

1  
2  
3  
4  
repeat  
    line = io.read() -- 从命令行获取输入  
	print(line)  
until line ~= ""  

—|—

for循环

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
for i = 1, 5 do  
	print(i)      
end  
-- 输出 1 2 3 4 5 想想为什么  
  
for i = 1, 10, 2 do  
	print(i)      
end  
-- 输出 1 3 5 7 9 想想为什么  
  
for i = 20, 10, -2 do  
	print(i)      
end  
-- 输出 20 18 16 14 12 想想为什么  
  
table = {1,2,3}  
for i=1, #table do  
    print(table[i])  
end  
-- #table 相当于取 table的长度,然后遍历  

—|—

上述可见,for 后面有三个参数 一个是初始化i,一个是结束判断,一个是加减i(默认为1)

Table的使用

  • Table类似于Java的list和map的结合体

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

-- 建立一个有数值的table  
local MyTable = {  
    1, 			-- 索引为1  
    2,			-- 索引为2  
    3,			-- 索引为3  
    4,			-- 索引为4  
    5,			-- 索引为5  
    table2 = {1,2,3}, -- 索引不为6  
    "ok"		-- 索引为6  
}  

—|—

为什么上面的table2的索引部位6呢?

Table的遍历方式

  • Table的复杂性导致其有三种遍历方式
  • 因为Table既是链表类型又是键值对类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

myTable = {  
    k = "x"  
}  
print(myTable[k])  
-- 输出 nil  
print(myTable["k"])  
-- 输出 x  
print(myTable.k)  
-- 输出 x  
  
-- 又或者直接  
s = "ok"  
myTable[s] = 10  
print(myTable[s])  
-- 直接通过键去设置值  

—|—

myTable.k 与 myTable[“k”]有所不同

  • myTable.k 等价于 myTable[“k”],索引的键就变成了字符串
  • myTable[k] 表示用变量k的值来索引table,索引的键可以是其他

普通遍历方式

1  
2  
3  
4  
5  
6  
7  
8  
myTable={  
    1,2,3,4,k = "ok",5  
}  
  
for i=1, #myTable do  
    print("value is "..myTable[i])  
end  
-- 只输出1,2,3,4,5 哦, 因为 "ok" 的键为 "k"  

—|—

for ipairs(迭代器)

1  
2  
3  
for i,v in ipairs(myTable) do  
    print(i,v)  
end  

—|—

与第一种for循环方式一样,都是按照当前索引的隐式索引来迭代并显示值的

for pairs(迭代器)

1  
2  
3  
for k,v in pairs(myTable) do  
    print(k,v)  
end  

—|—

按照键值对来输出

如果值为一个table,则会输出该table的地址

Table的作用

  1. 你可以作为第三方插件集成到项目中,为项目提供一个支持功能
  2. 完全使用table进行开发
  3. 当做一种数据的配置集(就是阵列)
  • 整体游戏的配置集(例子)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51

-- 使用lua,当做一种配置信息  
application_config = {  
    game_config = {  
        ifDebugModel = false, -- 调试模式  
        isCheatModel = true -- 作弊模式  
    },  
  
    sound_config = {  
        isBackgroundMusicOpen = true,  
        isEffectOpen = false  
    },  
  
    textrure_config = {  
<span class="line"

糖果

糖果
LUA教程

Lapis框架的常用处理方法

Lapis框架的常用处理方法 Continue reading

MoonScript实现选择排序

Published on February 26, 2017

MoonScript与Redis客户端

Published on January 19, 2017