lua學習筆記

lua特性總結:

  1. lua可以多重賦值,同時函數可以有多個返回值
  2. lua函數是一種first-class value
  3. lua函數可以嵌套,closure的概念
  4. 元表、元方法

  • 註釋
--:行註釋
--[[  ]]: 塊註釋
小技巧:
註釋代碼:
--[[  
代碼
--]]
重新啓用這段代碼:
---[[  
代碼
--]]

  • 全局變量:將一個值賦予一個全局變量就創建了該全局變量(訪問一個未創建的全局變量得到的值爲nil);刪除一個全局變量,只需將其賦值爲nil
  • 基礎類型
1.nil(空):
用於區別其它任何值;
可用於表示一種“無效值”的情況;
2.boolean(布爾):
false和true;
Lua將值false和nil視爲“假”,其它視爲真;
3.number(數字):
用來表示實數;
合法的表示方法:4、0.4、4.57e-3;
4.string(字符串):
字面字符串以一對匹配的單引號或雙引號來界定;
lua提供了字符串和數字的自動轉換;
手動轉換:
字符串轉數字:tonumber();
數字轉字符串:tostring();或者將該數字與一個空字符串相連接(number .. "")(..是字符串連接操作符);
#:長度操作符,放在字符串的前面,用於獲取字符串的長度;
5.table(表):
最簡單的構造表達式:a = {}; 
table永遠是匿名的,只能通過引用來持有table,當一個table的引用計數爲0時,lua的垃圾收集器會刪除該table;
table可以用不同類型的索引來訪問value;
a.x:等同於a["x"];
a[x]:等同與a[變量x的值];
數組通常以1做爲索引的起始值;
#:返回數組或線性表的最後一個索引值,以nil作爲界定數組結尾的標誌;
table.maxn:返回一個table的最大正索引數;
6.function(函數):
7.userdata(自定義類型):
8.thread(線程):

  • table構造式:

列表風格:a = {"Sunday", "Monday",},索引默認從1開始(print(a[1]) = "Sunday"),不能使用負數的索引;
記錄風格:a = {x="Sunday", y="Monday"},等價於{["x"]="Sunday", ["y"]="Monday"};
兩種風格混合(中間用;隔開):a = {"Sunday", "Monday"; x="Sunday", y="Monday"};
  • 多重賦值:
特性:首先匹配左右兩邊的賦值對象(丟掉多餘的、用nil補充不足的);然後同時進行賦值操作(沒有前後順序之分)。
1.用於交換變量的值:a, b = b, a;
2.用於函數返回多個值

  • 控制結構
1.if then  + end
2.if then elseif then else + end
3.while  do + end
4.repeat  until(相當於C++裏面的do while)
5.數字型for:
for var=exp1, exp2, exp3 do
end
var從exp1變化到exp2,每次變化的步長爲exp3,缺省爲1,如果不想設置上限的話,可以使用常量math.huge;

6.泛型for:
for <var-list> in <exp-list> do
    <body>
end
通常exp-list只有一個元素,即一句對迭代器工廠的調用;
如:for k, v in pairs(t) do print(k, v) end;
var-list第一元素稱爲控制變量,當它爲nil時,循環結束;
for做的第一件事情是對exp-list求值,for會保存三個值:迭代器函數、恆定狀態、控制變量初值;
在初始化步驟之後,for會以恆定狀態和控制變量來調用迭代器函數,然後for將迭代器函數的返回值賦予變量列表中的變量。如果第一個返回值爲nil,那麼循環終止。否則,執行循環體,並重復這個過程。
for var_1, ..., var_n in <exp-list> do <block> end
等價於:
do
  local _f, _s, _var = <explist>
  while true do
    local var_1, ..., var_n = _f(_s, _var)
    _var = var_1
    if _var==nil then break end
    <block>
  end
end
  • 變長參數:
function add(...)
  local s = 0
  for i, v  in ipairs{...} do
    s = s+v
  end
  return s
end

print(add(3, 4, 10, 25, 12))

參數中的...表示函數可接受不同數量的參數;
函數要訪問它的參數時,需要通過...來獲得;
如果變長參數中包含nil,則需要用函數select來訪問變長參數;
調用select時,必須傳入一個selector和變長參數列表。如果selector爲數字n,則返回它的第n個可變實參;如果selector爲字符串“#”,則返回變長參數的總數(包含nil);
for i=1, select("#", ...) do
  local arg = select(i, ...)  -- 得到第i個參數
  <body>
end

  • 具名參數:把函數形參列表放入到一個table中,調用函數時傳入實參table
  • 函數是一種第一類值(first-class value):表示lua中的函數與其它傳統類型具有相同的地位。可以存儲到變量或table中,可以作爲實參傳遞給函數,可以作爲函數的返回值
  • 詞法域(lexical scoping):一個函數可以嵌套到另一個函數中,內部的函數可以訪問外部函數中的局部變量(external local value / upvalue)
  • 閉包函數(closure):是指一個函數及一系列這個函數會訪問到的upvalue。因此,若一個closure沒有訪問到upvalue,那它就是一個傳統意義上的函數
  • 元表、元方法:
元表是元方法的集合,設置方法setmetatable(tablename, metatable);
元方法是自定義的操作集合,相當於C++中的操作符重載;
算術類的元方法:
+: __add
-:  __sub
*: __mul
/:  __div
-:  __unm(相反數)
%:__mod
^: __pow

關係類的元方法:
==:__eq
<:    __lt
<=:  __le

庫定義的元方法:
print():__tostring
__metatable:用於保護集合的元表,使用戶既不能看也不能修改集合的元表

__index元方法:
用於集合的查詢,當訪問table中不存在的字段時,解釋器就會去查找一個叫__index的元方法;

__newindex元方法:
用於集合的更新,當更新table中不存在的字段時,解釋器就會去查找一個叫__newindex的元方法;

具有默認值的table:
v1:
function setDefault(t, d)
    local mt = {__index = function() return d end}
    setmetatable(t, mt)
end

v2:
key = {}
local mt = {__index = function(t) return t[key] end}
function setDefault(t, d)
    t[key] = d
    setmetatable(t, mt)
end



相關鏈接:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章