lua学习笔记(一)

4.1k 词
    <h2 id="注释"><a href="https://Jaxes.github.io/#%E6%B3%A8%E9%87%8A" class="headerlink" title="注释"></a>注释</h2><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 等号数量只要两边一致即可</span></span><br><span class="line"><span class="comment">--[=[多行注释]=]</span></span><br></pre></td></tr></table></figure>

标识符

A-Z、a-z、下划线_开头后加上0个或多个字母、下划线、数字(0-9)

注意:最好不要使用下划线加大写字母,Lua保留字也是如此

不允许特殊字符@、$、%定义标识符

区分大小写

关键词

1
2
3
4
-- Lua的保留关键字
and break do else elseif end false for function local nil not or repeat return then true until while
-- 一般约定,以下划线开头连接一串大写字母的名字(如_VERSION)被保留用于Lua内部全局变量
_VERSION

全局变量

1
2
3
4
5
6
7
8
9
--[[
默认情况下变量认为是全局的,不需要声明,赋值后即创建了这个全局变量,访问一个没有初始化的全局变量不会出错,会返回nil
--]]
print(b) -- 返回nil
b=10
print(b) -- 返回10
-- 如果要删除一个全局变量,只需要将变量赋值为nil
b=nil
print(b) -- 返回nil

数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
-- Lua是动态类型语言,不需要定义,只需要赋值。值可以储存在变量中,作为参数传递或结果返回
-- 8个基本类型nil、boolean、number、string、userdata、function、thread、table
--[[
nil 只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)
boolean 包含两个值:false和true
number 双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由C或Lua编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线程,用于执行协程
table Lua中的表是一个“关联数组”,数组的索引可以是数字、字符串或表类型。在Lua里,table的创建时通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表
]]
type() -- 该函数可以测试给定变量或者值得类型

nil(空)

1
2
3
4
5
6
7
8
9
10
11
12
-- nil类型表示没有任何有效值,它只有一个值nil
print(type(a)) -- 输出nil
-- 对于全局变量和table,nil有删除的作用
tab1={key1="val1",key2="val2","val3"}
for k,v in pairs(tab1) do
print(k .. " - " .. v) -- ..运算符用于连接字符串
end

tab1.key1=nil
for k,v in pairs(tab1) do
print(k .. " - " .. v)
end

boolean(布尔)

1
2
3
4
5
6
7
-- 只有两个可选值:false、true,Lua把false和nil看作是“假”,其他的都为真
if false or nil then
print("至少有一个是true")
else
print("false和nil都为false!")
end
-- 执行结果为false和nil都为false!

number(数字)

1
2
3
-- Lua默认只有一种number类型 double(双精度)类型
print(type(2)) -- 输出number
print(type(2e+1)) -- 输出number

string(字符串)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string1="this is string1"
string2="this is string2"
-- 也可以用两个方括号“[[]]”来表示“一块”字符串,输出时会将换行和制表等格式也输出
string3=[[
emmmmmmmmmm
aaaaaaaaaaa
ruaruaruaruarua!
]]
-- 对一个数字字符串进行算术操作,Lua会尝试将这个数字字符串转成一个数字
print("2"+6) -- 输出8.0
print("-2e2"*"6") -- 输出-1200.0
-- 字符串连接使用..操作符,注意操作对象如果为数字,则操作对象与操作符之间需要加空格
print("2".."b") -- 输出2b
print(233 .. 666) -- 输出233666
-- 使用#来计算字符串长度,放在字符串前面
len="www.rua.com"
print(#len) -- 输出11
print(#"helloworld") -- 输出10

table(表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 创建一个空表
local tbl1={}
-- 直接初始表
local tbl2={"a","b","c","d"}
-- 创建键值对
a["key"]="value"
a[1]=22
key=10 -- 这里只是赋值,赋值后用于后面的创建键值对
a[key]=22
a[a[key]]=a[key]+11
-- 在Lua中,默认初始索引一般以1开始
local tb1={"a","b","c"}
for key,val in pairs(tb1) do
print("Key",key)
end
--[[
输出:
Key 1
Key 2
Key 3
]]
-- table的长度是动态增长的

function(函数)

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
-- 在Lua中,函数是被看作“第一类值(First-Class Value)”,函数可以存在变量里
function fun1(n) -- 一个递归求阶乘的函数
if n == 0 then
return 1
else
return n*fun1(n-1)
end
end
print(fun1(5)) -- 输出120
fun2=fun1
print(fun2(5)) -- 输出120
-- 也可以使用匿名函数的形式
function testFun(tab,fun)
for k,v in pairs(tab) do
print(fun(k,v))
end
end

tab={kay1="val1",key2="val2"}
testFun(tab,
function(key,val)
return key .. "=" .. val
end
)
--[[
执行结果:
key1=val1
key2=val2
]]

thread(线程)

Lua中主要的线程是协程(coroutine)

线程可以同时多个运行,协程任意时刻只能运行一个

userdata(自定义类型)

用户自定义数据,用于表示一种由应用进程或C/C++语言库所创建的类型,可以将任意C/C++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中调用