一、lua變量【 全局變量和局部變量和表中的域】
Lua 變量有三種類型:全局變量和局部變量和表中的域。
? 全局變量:默認(rèn)情況下,Lua中所有的變量都是全局變量。
? 局部變量:使用
local
顯式聲明在函數(shù)內(nèi)的變量,以及函數(shù)的參數(shù),都是局部變量。在函數(shù)外即使用local
去聲明,它的作用域也是當(dāng)前的整個(gè)文件,這相當(dāng)于一個(gè)全局變量。? 表中的域:變量的默認(rèn)值均為
nil
。? Lua語言不區(qū)分未初始化變量和被賦值為
nil
的變量,因此全局變量無須聲明即可使用。
1、全局變量
全局變量,不需要聲明,只需要將一個(gè)值賦予一個(gè)全局變量即可創(chuàng)建了
。
b=10 -- 這個(gè)b就是一個(gè)全局變量了
print(b)
- 通常沒必要?jiǎng)h除一個(gè)全局變量,如果一個(gè)變量生存周期較為短,使用局部變量即可。不過,如果真的想刪除全局變量的話,只需將它賦值為nil。
b=nil -- 這個(gè)全局變量b就被刪除了
print(b)
2、局部變量-使用local 聲明
-
Lua 中的變量全是全局變量,哪怕是語句塊或是函數(shù)里,除非用 local 顯式聲明為局部變量。
-
局部變量的作用域?yàn)閺穆暶魑恢瞄_始到所在語句塊結(jié)束。
■ 建議:在Lua中,應(yīng)盡可能使用局部變量,好處:
- 避免命名沖突
- 訪問局部變量的速度比全局變量更快
3、lua表中的域
a = {}
a[10] = 1
for i=1,15,1 do
print(a[i])
end
- 結(jié)果:
二、lua數(shù)據(jù)類型、if判斷條件
Lua 是動(dòng)態(tài)類型語言,變量不要類型定義,只需要為變量賦值。 值可以存儲(chǔ)在變量中,作為參數(shù)傳遞或結(jié)果返回。
1、Lua 中有 8 個(gè)基本類型分別為:nil、boolean、number、string、userdata、function、thread 和 table。
數(shù)據(jù)類型 | 描述 |
---|---|
nil |
空值,只有值nil屬于該類,表示一個(gè)無效值 (在條件表達(dá)式中相當(dāng)于false)。 |
boolean | 布爾類型 |
number | 數(shù)值類型,相當(dāng)于C語言的double |
string | 字符串類型,由一對(duì)雙引號(hào)或單引號(hào)來表示 |
function | 函數(shù)類型,由 C 或 Lua 編寫的函數(shù) |
table |
Lua 中的表(table)其實(shí)是一個(gè)"關(guān)聯(lián)數(shù)組"(associative arrays),數(shù)組的索引可以是數(shù)字、字符串或表類型。在 Lua 里,table 的字面量是用{} 表示。 {},表示創(chuàng)建一個(gè)空表。 |
thread | 線程類型,表示執(zhí)行的獨(dú)立線路,用于執(zhí)行協(xié)同程序 |
userdata | 表示任意存儲(chǔ)在變量中的C數(shù)據(jù)結(jié)構(gòu) |
2、type(變量名)
- 作用:獲取該變量的類型
3、lua 的if 判斷條件是理解為是否有效
?什么時(shí)候會(huì)【無效】錯(cuò)誤失敗---為nil和false的時(shí)候
- nil 表示空值、無效值
?其他情況為數(shù)字、字符串、true、表(甚至是空表也是正確的),判斷條件都是【有效】正確成功的!
三、lua數(shù)據(jù)結(jié)構(gòu)-table
0、table的字面量:{},創(chuàng)建的空表,內(nèi)部的域默認(rèn)值是nil。
- 表用大括號(hào){}來構(gòu)造,可以是多維的 {{}}。
1、lua中的表,其實(shí)是一個(gè)"關(guān)聯(lián)數(shù)組",關(guān)聯(lián)數(shù)組是一種具有特殊索引的數(shù)組,數(shù)組的索引可以是數(shù)組、字符串、表等[除了nil]。
- 表中的元素是鍵值對(duì)形式。key 也就是數(shù)組的索引。表的key是唯一的。表是可以自定義鍵名。
2、table 是沒有固定大小的,可以添加任意數(shù)量的元素到數(shù)組中。
3、table 是lua中最主要的數(shù)據(jù)結(jié)構(gòu)機(jī)制,也是唯一的數(shù)據(jù)結(jié)構(gòu)。用它可以實(shí)現(xiàn)數(shù)組,哈希表、集合、字典等等。還可以通過table 表示對(duì)象、包、模塊。
其實(shí)lua 中的table 概念,相當(dāng)于java中的對(duì)象的概念。萬物皆是對(duì)象。
4、表中元素的刪除,有兩種方式:直接設(shè)置為nil或調(diào)用remove方法刪除
- 兩種刪除方式的區(qū)別:直接把元素賦值為nil,會(huì)留下空位,不影響其他元素。而用remove函數(shù)去刪除,會(huì)把后面的元素往前移,補(bǔ)位。
5、表中元素有多少個(gè),可以使用#獲取
6、表中的索引是從1開始的
tb={'干飯', '吃飯', '恰飯'}
- 實(shí)際上,tb如下:
-- tb的情況如下:
-- 地址table(c917ad2)
{
[1] = '干飯',
[2] = '吃飯',
[3] = '恰飯',
}
7、表有自定義鍵的時(shí)候:
-- 表中只寫了值value作為元素
tb={'干飯', '吃飯', '恰飯', s='溜達(dá)'}
- 實(shí)際上,表是有默認(rèn)分配鍵key的,默認(rèn)分配的鍵是從數(shù)字1開始的,tb表中的分配如下:
-- tb的情況如下:
-- 地址table(c917ad3)
{
[1] = '干飯',
[2] = '吃飯',
[3] = '恰飯',
['s'] = '溜達(dá)',--細(xì)節(jié):s會(huì)被帶上引號(hào)
}
細(xì)節(jié):要通過自定義的s鍵獲取到值,s是要加上引號(hào)的。
對(duì)于自定義的鍵有一個(gè)語法糖,中括號(hào)可以使用點(diǎn)代替
表中默認(rèn)分配的鍵和自定義鍵的執(zhí)行順序是:默認(rèn)的先執(zhí)行,然后再是自定義的鍵
-- 表中只寫了值value作為元素
tb={'干飯',a='溜達(dá)',b='哈哈哈', _='餓了么','吃飯', '恰飯'}
- 實(shí)際上,tb表中的分配如下:程序分配鍵的時(shí)候,會(huì)先跳過自定義鍵,再接著分配。
-- tb的情況如下:
-- 地址table(c917ad3)
{
[1] = '干飯',
[2] = '吃飯',
[3] = '恰飯',
['a'] = '溜達(dá)',
['b'] = '哈哈哈',
['_'] = '餓了么',
}
- 結(jié)果:
8、table 提供的增刪元素的方法 table.insert 和 table.remove
-
table.insert(表名,要增加的鍵位,要增加的值) 直接再最后的位置增加元素:table.insert(表名,要增加的值)
-
table.remove(表名,要?jiǎng)h除的鍵位)
四、lua 函數(shù)(形參-實(shí)參數(shù)數(shù)量不匹配、多重返回值、不定長參數(shù)、方法的冒號(hào)和點(diǎn)-self隱式參數(shù))
0、lua 程序是嚴(yán)格從上到下的順序執(zhí)行代碼的, 函數(shù)的聲明必須在寫函數(shù)調(diào)用前面。
在lua中,函數(shù)是作為第一類型,
函數(shù)是可以存在在變量中,也可以通過參數(shù)傳遞給其他函數(shù),還可以作為其他函數(shù)的返回值,還可以作為table表中的鍵
1、函數(shù)定義的方式
-- 方式1:
function 函數(shù)名(參數(shù)列表)
函數(shù)內(nèi)容
end
-- 方式2:
函數(shù)名=function(參數(shù)列表)
函數(shù)內(nèi)容
end
2、lua 函數(shù)
① 函數(shù)是可以存在在變量中【匿名函數(shù)
】
a = function(x, y)
return x * y
end
b = a
print(b(2,3))
-
結(jié)果:
6
? 在table中也可以存在function函數(shù)
tab = {
test=function()
print("Hello World!")
end
}
tab.test()
- 結(jié)果:
Hello World!
3、形參-實(shí)參數(shù)數(shù)量不匹配
- 傳入的實(shí)參數(shù)量 > 定義的形參數(shù)量:多傳入的參數(shù),直接被忽略了
- 傳入的實(shí)參數(shù)量 < 定義的形參數(shù)量:缺少的參數(shù),使用nil替補(bǔ)
4、多重返回值
- 舉例1:
- 舉例2:
- 小細(xì)節(jié):多個(gè)具有多重返回值的函數(shù)連續(xù)調(diào)用[使用,間隔],只有最后一個(gè)函數(shù)被展開,即最后一個(gè)函數(shù)才有資格返回多個(gè)值,其他函數(shù)都默認(rèn)返回第一個(gè)值
5、不定長參數(shù)
- 和java 一樣,不定長參數(shù)使用...表示,并且作為函數(shù)的最后一個(gè)參數(shù)。
- 用 select 函數(shù)來訪問變長參數(shù)了
- select('#', …) 返回可變參數(shù)的長度。
- select(n, …) 用于返回從起點(diǎn) n 開始到結(jié)束位置的所有參數(shù)列表。
6、方法的冒號(hào)和點(diǎn)-self隱式參數(shù)
? Lua 定義或調(diào)用方法時(shí)的語法糖-冒號(hào),表示參數(shù)self
這個(gè)語法糖是用冒號(hào),表示self,相當(dāng)于java中的this
■ 舉例1:
--定義
Account = { balance = 0 }
--withdraw 方法有兩個(gè)參數(shù),一個(gè)self【相當(dāng)于java中的this】是指向當(dāng)前table的Account
function Account.withdraw(self, v)
self.balance = self.balance - v
end
--等價(jià)寫法:
function Account:withdraw(v) --通過冒號(hào),表示定義了第一個(gè)參數(shù)是self
self.balance = self.balance - v
end
--調(diào)用
Account.withdraw(self, 100)
--等價(jià)寫法
Account:withdraw(100)
■ 舉例2:
-- 在table的鍵值對(duì)的value---是function的時(shí)候,方法的參數(shù)是self,并且還將self 參數(shù)傳遞給function方法體的另外一個(gè)方法
-- {} 在lua中表示table
tbWnd.tbOnClick = {
btnOk = function(self)
self:onClickOK() -- 相當(dāng)于onClickOK(self)
end,
}
7、函數(shù)嵌套調(diào)用,并且作為參數(shù)的那個(gè)函數(shù),它是需要有參數(shù)傳入
① 通過將參數(shù)存儲(chǔ)到table中,table又綁定上的函數(shù),該函數(shù)就可以通過self.key 拿到參數(shù)
② 然后外層的函數(shù)(func,table)
local tbTable = {}
tbTable.key1 = 1
function tbTable:func1()--這樣寫,隱式參數(shù)是self
print(self.key1)
end
-- 函數(shù)嵌套調(diào)用
function func2(func,tbSelf)
func(tbself)
end
-- 執(zhí)行
func(tbTable.func1)
8、函數(shù)返回值為空,nil 可以省略,return nil 也可以省略
9、函數(shù)的括號(hào)在只有一個(gè)參數(shù)[并且參數(shù)是字符串或者表]的情況下可以省略不寫
- 一般是在調(diào)用的時(shí)候,明確已經(jīng)參數(shù)是字符串或者表,才可以省略括號(hào)
-- 舉例1:
print("Hello") --> print "Hello"
-- 舉例2:
function func (num)
print(num)
end
func "hello"
func {1,2,3}
- 細(xì)節(jié):不知道參數(shù)類型的情況下,是不可以省略括號(hào)的
? 五、lua 函數(shù)常見寫法
1、直接構(gòu)建
function func(...)
print(...)
end
-- 調(diào)用函數(shù)
func(123)
2、表構(gòu)建,key存儲(chǔ)函數(shù)(1)
local tbTable = {}
function tbTable.func1(...)
print(...)
end
function tbTable.func2(...)
print(...)
end
-- 調(diào)用函數(shù)
tbTable.func1(123)
tbTable.func1(4,5,6)
3、表構(gòu)建,key存儲(chǔ)函數(shù)(2)
local tbTable = {}
tbTable.func1 = function(...)
print(...)
end
tbTable.func2 = function(...)
print(...)
end
-- 調(diào)用函數(shù)
tbTable.func1(123)
tbTable.func1(4,5,6)
4、表構(gòu)建,key存儲(chǔ)函數(shù)(3)
local tbTable = {
func1 = function(...)
print(...)
end,
func2 = function(...)
print(...)
end
}
-- 調(diào)用函數(shù)
tbTable.func1(123)
tbTable.func1(4,5,6)
六、函數(shù)嵌套|閉包
1、local 特點(diǎn):
局部變量:使用local
顯式聲明在函數(shù)內(nèi)的變量,以及函數(shù)的參數(shù),都是局部變量。
在函數(shù)外即使用local去聲明,它的作用域也是當(dāng)前的整個(gè)文件,這相當(dāng)于一個(gè)全局變量。
2、函數(shù)嵌套|閉包
(1) 特點(diǎn):函數(shù)的調(diào)用是用() 表示,有多少層,函數(shù)真正調(diào)用就需要多少個(gè)()
(2) 舉例子:
- 舉例子1:
local f = function(n)
return function(x)
return x+n
end
end
print(f(1)(2)) -- 函數(shù)嵌套,每一層都相當(dāng)于()
a = f(1)
print(a(10))
-
結(jié)果:
3
11
- 舉例子2:local 在函數(shù)外相當(dāng)于java的全局變量【獨(dú)立的作用域強(qiáng)調(diào)的就是這個(gè)在函數(shù)外面的local 變量】
local p = 1
local f = function()
local v = 0 -- local 在[下面的]函數(shù)外面相當(dāng)于java的全局變量
return function()
v = v + p
print(v)
end
end
a,b = f(), f()
a(); b();
p = 2
a(); b();
-
結(jié)果:
1
1
3
3
-
local 在函數(shù)外相當(dāng)于java的全局變量【獨(dú)立的作用域】
class A{
private int v; -- 全局變量
public void add(){}
}
- 舉例子3:
local f = function()
return {
add = function(a,b)
return a + b
end,
sub = function(a,b)
return a - b
end,
}
end
v = f()
print(v.add(1,2))
print(v.sub(2,1))
-
結(jié)果:
3
1
文章來源:http://www.zghlxwxcb.cn/news/detail-417838.html
如果本文對(duì)你有幫助的話記得給一樂點(diǎn)個(gè)贊哦,感謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-417838.html
到了這里,關(guān)于lua變量、數(shù)據(jù)類型、if判斷條件和數(shù)據(jù)結(jié)構(gòu)table以及【lua 函數(shù)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!