Lua 變數有三種型別:全域性變數和區域性變數和表中的域。
▪ 全域性變數:預設情況下,Lua中所有的變數都是全域性變數。
▪ 區域性變數:使用
local
顯式宣告在函數內的變數,以及函數的引數,都是區域性變數。在函數外即使用local
去宣告,它的作用域也是當前的整個檔案,這相當於一個全域性變數。▪ 表中的域:變數的預設值均為
nil
。☺ Lua語言不區分未初始化變數和被賦值為
nil
的變數,因此全域性變數無須宣告即可使用。
全域性變數,不需要宣告,只需要將一個值賦予一個全域性變數即可建立了
。
b=10 -- 這個b就是一個全域性變數了
print(b)
b=nil -- 這個全域性變數b就被刪除了
print(b)
Lua 中的變數全是全域性變數,哪怕是語句塊或是函數裡,除非用 local 顯式宣告為區域性變數。
區域性變數的作用域為從宣告位置開始到所在語句塊結束。
■ 建議:在Lua中,應儘可能使用區域性變數,好處:
- 避免命名衝突
- 存取區域性變數的速度比全域性變數更快
a = {}
a[10] = 1
for i=1,15,1 do
print(a[i])
end
Lua 是動態型別語言,變數不要型別定義,只需要為變數賦值。 值可以儲存在變數中,作為引數傳遞或結果返回。
資料型別 | 描述 |
---|---|
nil |
空值,只有值nil屬於該類,表示一個無效值 (在條件表示式中相當於false)。 |
boolean | 布林型別 |
number | 數值型別,相當於C語言的double |
string | 字串型別,由一對雙引號或單引號來表示 |
function | 函數型別,由 C 或 Lua 編寫的函數 |
table |
Lua 中的表(table)其實是一個"關聯陣列"(associative arrays),陣列的索引可以是數位、字串或表型別。在 Lua 裡,table 的字面量是用{} 表示。 {},表示建立一個空表。 |
thread | 執行緒型別,表示執行的獨立線路,用於執行協同程式 |
userdata | 表示任意儲存在變數中的C資料結構 |
table的字面量:{}
,建立的空表,內部的域預設值是nil。table 是lua中最主要的資料結構機制,也是唯一的資料結構。用它可以實現陣列,雜湊表、集合、字典等等。還可以通過table 表示物件、包、模組。
其實lua 中的table 概念,相當於java中的物件的概念。萬物皆是物件。
tb={'乾飯', '吃飯', '恰飯'}
-- tb的情況如下:
-- 地址table(c917ad2)
{
[1] = '乾飯',
[2] = '吃飯',
[3] = '恰飯',
}
-- 表中只寫了值value作為元素
tb={'乾飯', '吃飯', '恰飯', s='溜達'}
-- tb的情況如下:
-- 地址table(c917ad3)
{
[1] = '乾飯',
[2] = '吃飯',
[3] = '恰飯',
['s'] = '溜達',--細節:s會被帶上引號
}
細節:要通過自定義的s鍵獲取到值,s是要加上引號的。
對於自定義的鍵有一個語法糖,中括號可以使用點代替
表中預設分配的鍵和自定義鍵的執行順序是:預設的先執行,然後再是自定義的鍵
-- 表中只寫了值value作為元素
tb={'乾飯',a='溜達',b='哈哈哈', _='餓了麼','吃飯', '恰飯'}
-- tb的情況如下:
-- 地址table(c917ad3)
{
[1] = '乾飯',
[2] = '吃飯',
[3] = '恰飯',
['a'] = '溜達',
['b'] = '哈哈哈',
['_'] = '餓了麼',
}
table.insert(表名,要增加的鍵位,要增加的值) 直接再最後的位置增加元素:table.insert(表名,要增加的值)
table.remove(表名,要刪除的鍵位)
在lua中,函數是作為第一型別,
函數是可以存在在變數中,也可以通過引數傳遞給其他函數,還可以作為其他函數的返回值,還可以作為table表中的鍵
-- 方式1:
function 函數名(參數列)
函數內容
end
-- 方式2:
函數名=function(參數列)
函數內容
end
匿名函數
】a = function(x, y)
return x * y
end
b = a
print(b(2,3))
結果:
6
tab = {
test=function()
print("Hello World!")
end
}
tab.test()
Hello World!
這個語法糖是用冒號,表示self,相當於java中的this
--定義
Account = { balance = 0 }
--withdraw 方法有兩個引數,一個self【相當於java中的this】是指向當前table的Account
function Account.withdraw(self, v)
self.balance = self.balance - v
end
--等價寫法:
function Account:withdraw(v) --通過冒號,表示定義了第一個引數是self
self.balance = self.balance - v
end
--呼叫
Account.withdraw(self, 100)
--等價寫法
Account:withdraw(100)
-- 在table的鍵值對的value---是function的時候,方法的引數是self,並且還將self 引數傳遞給function方法體的另外一個方法
-- {} 在lua中表示table
tbWnd.tbOnClick = {
btnOk = function(self)
self:onClickOK() -- 相當於onClickOK(self)
end,
}
local tbTable = {}
tbTable.key1 = 1
function tbTable:func1()--這樣寫,隱式引數是self
print(self.key1)
end
-- 函數巢狀呼叫
function func2(func,tbSelf)
func(tbself)
end
-- 執行
func(tbTable.func1)
function func(...)
print(...)
end
-- 呼叫函數
func(123)
local tbTable = {}
function tbTable.func1(...)
print(...)
end
function tbTable.func2(...)
print(...)
end
-- 呼叫函數
tbTable.func1(123)
tbTable.func1(4,5,6)
local tbTable = {}
tbTable.func1 = function(...)
print(...)
end
tbTable.func2 = function(...)
print(...)
end
-- 呼叫函數
tbTable.func1(123)
tbTable.func1(4,5,6)
local tbTable = {
func1 = function(...)
print(...)
end,
func2 = function(...)
print(...)
end
}
-- 呼叫函數
tbTable.func1(123)
tbTable.func1(4,5,6)
區域性變數:使用local
顯式宣告在函數內的變數,以及函數的引數,都是區域性變數。
在函數外即使用local去宣告,它的作用域也是當前的整個檔案,這相當於一個全域性變數。
local f = function(n)
return function(x)
return x+n
end
end
print(f(1)(2)) -- 函數巢狀,每一層都相當於()
a = f(1)
print(a(10))
結果:
3
11
local p = 1
local f = function()
local v = 0 -- local 在[下面的]函數外面相當於java的全域性變數
return function()
v = v + p
print(v)
end
end
a,b = f(), f()
a(); b();
p = 2
a(); b();
結果:
1
1
3
3
local 在函數外相當於java的全域性變數【獨立的作用域】
class A{
private int v; -- 全域性變數
public void add(){}
}
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))
結果:
3
1
如果本文對你有幫助的話記得給一樂點個贊哦,感謝!
本文來自部落格園,作者:一樂樂,轉載請註明原文連結:https://www.cnblogs.com/shan333/p/17331661.html