Lua面試題目


1、Lua的特性

 

  • 輕量級: 它用標准C語言編寫並以源代碼形式開放,編譯后僅僅一百余K,可以很方便的嵌入別的程序里。
  • 可擴展: Lua提供了非常易於使用的擴展接口和機制:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣。
  • 其它特性:
    • 支持面向過程(procedure-oriented)編程和函數式編程(functional programming);
    • 自動內存管理;只提供了一種通用類型的表(table),用它可以實現數組,哈希表,集合,對象;
    • 語言內置模式匹配;閉包(closure);函數也可以看做一個值;提供多線程(協同進程,並非操作系統所支持的線程)支持;
    • 通過閉包和table可以很方便地支持面向對象編程所需要的一些關鍵機制,比如數據抽象,虛函數,繼承和重載等。

2、Lua數據類型

 

 

Lua是動態類型語言,變量不要類型定義,只需要為變量賦值。 值可以存儲在變量中,作為參數傳遞或結果返回。

Lua中有8個基本類型分別為:nil、boolean、number、string、userdata、function、thread和table。

其中:Lua 把 false 和 nil 看作是"假",其他的都為"真":

 

3、pairs 和 ipairs區別

 

  •   pairs: 迭代 table,可以遍歷表中所有的 key 可以返回 nil
  •  ipairs: 迭代數組,不能返回 nil,如果遇到 nil 則退出

 

代碼示例:

local tab= { [1] = "a", [3] = "b", [4] = "c" } for i,v in pairs(tab) do -- 輸出 "a" ,"b", "c" , print( tab[i] ) end for i,v in ipairs(tab) do -- 輸出 "a" ,k=2時斷開 print( tab[i] ) end

 

4、Lua元表(Metatable)

 

在 Lua table 中我們可以訪問對應的key來得到value值,但是卻無法對兩個 table 進行操作。

因此 Lua 提供了元表(Metatable),允許我們改變table的行為,每個行為關聯了對應的元方法。

例如,使用元表我們可以定義Lua如何計算兩個table的相加操作a+b。

當Lua試圖對兩個表進行相加時,先檢查兩者之一是否有元表,之后檢查是否有一個叫"__add"的字段,若找到,則調用對應的值。"__add"等即時字段,其對應的值(往往是一個函數或是table)就是"元方法"。

有兩個很重要的函數來處理元表:

  • setmetatable(table,metatable): 對指定table設置元表(metatable),如果元表(metatable)中存在__metatable鍵值,setmetatable會失敗 。
  • getmetatable(table): 返回對象的元表(metatable)。

__index 元方法

這是 metatable 最常用的鍵。

當你通過鍵來訪問 table 的時候,如果這個鍵沒有值,那么Lua就會尋找該table的metatable(假定有metatable)中的__index 鍵。如果__index包含一個表格,Lua會在表格中查找相應的鍵。

 

Lua查找一個表元素時的規則,其實就是如下3個步驟:

  • 1.在表中查找,如果找到,返回該元素,找不到則繼續
  • 2.判斷該表是否有元表,如果沒有元表,返回nil,有元表則繼續。
  • 3.判斷元表有沒有__index方法,如果__index方法為nil,則返回nil;如果__index方法是一個表,則重復1、2、3;如果__index方法是一個函數,則返回該函數的返回值。

__newindex 元方法

 

__newindex 元方法用來對表更新,__index則用來對表訪問 。

當你給表的一個缺少的索引賦值,解釋器就會查找__newindex 元方法:如果存在則調用這個函數而不進行賦值操作。

__call 元方法

__call 元方法在 Lua 調用一個值時調用。

__tostring 元方法

__tostring 元方法用於修改表的輸出行為。

 

5、閉包

閉包:通過調用含有一個內部函數加上該外部函數持有的外部局部變量(upvalue)的外部函數(就是工廠)產生的一個實例函數

閉包組成:外部函數+外部函數創建的upvalue+內部函數(閉包函數)

http://www.cnblogs.com/zzy-frisrtblog/p/5864209.html

 

6、C和lua的互相調用

http://blog.csdn.net/wwwsq/article/details/7835619

http://www.cnblogs.com/sevenyuan/p/4511808.html

7、Lua熱更新機制的實現

 

    Lua熱更新原理及示例

 

8、Lua 協同程序(coroutine)
什么是協同(coroutine)?
Lua 協同程序(coroutine)與線程比較類似:擁有獨立的堆棧,獨立的局部變量,獨立的指令指針,同時又與其它協同程序共享全局變量和其它大部分東西。
協同是非常強大的功能,但是用起來也很復雜。
線程和協同程序區別
線程與協同程序的主要區別在於,一個具有多個線程的程序可以同時運行幾個線程,而協同程序卻需要彼此協作的運行。
在任一指定時刻只有一個協同程序在運行,並且這個正在運行的協同程序只有在明確的被要求掛起的時候才會被掛起。
協同程序有點類似同步的多線程,在等待同一個線程鎖的幾個線程有點類似協同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM