Lua4.0 參考手冊(七)6.1

(接上篇)
--------------------------------------
6 標準庫
--------------------------------------
標準庫提供了一些有用的函數,這些函數直接由標準 API 實現。所以,它們並不是語言必需的部分,而且做爲單獨的 C 模塊被提供。目前,Lua 有如下標準庫:
> 基本庫;
> 字符串處理;
> 數學函數(sin, log, 等)
> 輸入輸出(和一些系統功能)

爲了能使用這些庫,宿主程序必須調用函數 lua_baselibopen, lua_strlibopen, lua_mathlibopen, 和 lua_iolibopen, 這幾個都在 lualib.h 中聲明。

-------------------
6.1 基本庫
-------------------
基本庫提供了一些核心功能。所以,若是在你的應該程序中不包含這些庫的話,你應該當心地檢查你是否須要爲一些功能提供一些替代的實現。(例如,沒有函數 _ERRORMESSAGE,Lua 就不能顯示錯誤信息。)

_ALERT (message)
在標準錯誤輸出 stderr 上打印它惟一的字符串參數。全部的 Lua 中的錯誤信息由保存於全局變量(參見 4.7 節)_ALERT 中的函數打印。所以,一個程序能夠給這個變量賦另外一個函數來改變這樣的信息的顯示方式(例如,對於沒有 stderr 的系統)。

assert (v [, message])
產生一個 ``assertion failed!'' 錯誤當它的參數 v 是 nil 時。這個函數和下面的 Lua 函數等價:
算法

    function assert (v, m)
      if not v then
        m = m or ""
        error("assertion failed! " .. m)
      end
    end

call (func, arg [, mode [, errhandler]])
使用由表 arg 給定的參數調用函數 func 。這個調用和下面的等價
    func(arg[1], arg[2], ..., arg[n])
這裏 n 是 getn(arg) 的結果(參見 6.1 節)。全部的 func 的結果簡單的由 call 返回。

默認狀況下,在一個錯誤產生於調用 func 時,這個錯誤會被傳播出去。若是字符串 mode 包含 "x",那麼這個調用就是受保護的。在這種模式下,函數 call 不會傳播錯誤,無論調用期間發生了什麼。反而,它返回 nil 來標誌錯誤(並且調用適當的錯誤處理)。

若是 errhandler 提供了,錯誤函數 _ERRORMESSAGE 臨時設置給 errhandler ,當 func 執行時。特別地,若是 errhandler 爲 nil,在執行被調用函數期間不會有錯誤信息被分發。

collectgarbage ([limit])
設置垃圾收集的臨界值爲給定的 limit(單位爲千字節),並對比檢查它和字節計數器。若是新的臨界值比字節計數器小,那麼 Lua 會馬上執行垃圾回收(參見 5.6 節)。若是省略 limit ,它的默認爲 0 (所以強制執行一次垃圾回收)。

copytagmethods (tagto, tagfrom)
拷貝全部的標籤方法從一個標籤到另外一個,返回 tagto。

dofile (filename)
接受一個文件名字,打開命名文件,並執行它的內容作爲一個 Lua 塊,或者作爲預編譯的塊。當無參調用它時,它執行標準輸入(stdin)的內容。若是執行文件時出現了任何錯誤,dofile 返回 nil。不然,它返回塊返回的結果,或者一個非 nil 值若是塊沒有返回值。它會產生一個錯誤若是用一個非字符串參數調用它。

dostring (string [, chunkname])
執行一個給定的字符串作爲一個 Lua 塊。若是執行字符串時出現了任何錯誤,dostring 返回 nil。不然,它返回塊返回的結果,或者一個非 nil 值若是塊沒有返回值。可選的參數 chunkname 是 ``name of the chunk'',被用在錯誤信息和調試信息中。
error (message)
調用錯誤處理(參見 4.7 節)而且終止最後一個受保護函數的調用(在 C 裏是:lua_dofile, lua_dostring, lua_dobuffer, 或者 lua_callfunction; 在 Lua 裏是:dofile, dostring, 或者 call 在保護模式裏)。若是 message 是 nil,錯誤處理不會被調用。函數 error 從不返回。

foreach (table, func)
在表的全部元素上執行給定的 func。對於每個元素,函數以參數 index 和 value 作爲參數被調用。若是函數返回非 nil 的值,那麼循環退出,這個值就就做爲 foreach 最終的結果。這個函數能夠被定義爲 Lua:
安全

    function foreach (t, f)
      for i, v in t do
        local res = f(i, v)
        if res then return res end
      end
    end

foreach 的行爲是未定義的若是你在遍歷過程當中改變了表 t 。

foreachi (table, func)
在表的全部數值索引上執行給定的 func。對於每個索引,函數以參數 index 和 value 作爲參數被調用。索引按順序被訪問,從 1 到 n,這裏 n 是 getn(table) 的結果(參見 6.1 節)。若是函數返回非 nil 的值,那麼循環退出,這個值就就做爲 foreachi 最終的結果。這個函數能夠被定義爲 Lua:
函數

    function foreachi (t, f)
      for i=1,getn(t) do
        local res = f(i, t[i])
        if res then return res end
      end
    end

getglobal (name)
返回全局變量的值,或者調用一個``getglobal''標籤方法。它的完整的語義在 4.8 描述。字符串 name 不須要是一個合乎語法的有效的變量名。

getn (table)
返回表的尺寸,當 table 被看做 list 的時候。若是表有一個 n 字段且值是一個數值型,這個值就是表的尺寸。不然,尺寸就是表中值不是 nil 的最大的索引。這個函數能夠被定義爲 Lua:
測試

    function getn (t)
      if type(t.n) == "number" then return t.n end
      local max = 0
      for i, _ in t do
        if type(i) == "number" and i>max then max=i end
      end
      return max
    end

gettagmethod (tag, event)
返回一個給定對(tag, event 對)當前的標籤方法。這個函數不能夠被用來得到 ``gc'' 事件的標籤方法。(這樣的標籤方法只能夠由 C 代碼來操縱。)

globals ([table])
返回當前的全局表。若是參數 table 給定了,它也把當前的全局表設置爲這個參數。

newtag ()
返回一個新的標籤。

next (table, [index])
容許一個程序遍歷一個表的全部字段。它的第一個參數是一個表,第二個參數是表中的索引。它返回表的下一個索引和索引所對應的值。當用 nil 作爲第二個參數調用它時,函數返回表的第一個健值對。當用最後一個索引調用,或者用 nil 調用一個空表,均返回 nil。若是沒有第二個參數,它被解釋爲 nil 。
Lua 中沒有字段的聲明;在語義上,表中一個字段不存在和字段的值爲 nil 沒有區別。因此,該函數只考慮非 nil 的字段。索引的枚舉順序沒有規定,就算是數字索引的也沒有規定(爲遍歷一個表以數字順序,使用一個數值型 for 或者函數 foreachi)。
next 的行爲是未定義的若是你在遍歷過程當中改變了表。

print (e1, e2, ...)
能夠接受任意數量的參數,以 tostring 返回的字符串打印它們的值。這個函數不是爲了格式化輸出,只是爲了以一種快速的方法顯示一個值,例如打印一個調試信息。參見 6.4 節一個格式化輸出函數。

rawget (table, index)
返回 table[index] 的真實值,避免喚起任何標籤方法。table 必須是一個表,index 是一個不一樣於 nil 的值。
rawset (table, index, value)
以 value 設置 table[index] 的真實值,避免喚起任何標籤方法。table 必須是一個表,index 是一個不一樣於 nil 的值,value 能夠是任何 Lua 值。

setglobal (name, value)
設置具名全局變量爲給定值,或者調用一個 ``setglobal'' 的標籤方法。它的完整的語義描述在 4.8 節。字符串 name 不須要是一個合乎語法的有效名字。
settag (t, tag)
設置給定表(參見 3 節)的標籤。tag 必須是一個收 newtag 生成的值(參見 6.1 節)。settag 返回它的第一個參數的值(表)。爲了宿主程序的安全性,在 Lua 中改變一個 userdata 的標籤是不可能的。

settagmethod (tag, event, newmethod)
爲新定的對(tag, event 對)設置一個新的標籤方法並返回老的方法。若是 newmethod 爲 nil,那麼 settagmethod 恢復給定事件的默認行爲。這個函數不能夠用來爲 ``gc'' 事件設置標籤方法。(這樣的標籤方法只能有 C 代碼來操縱。)
sort (table [, comp])
以給定順序排序表中的元素,就地排序,從 table[1] 到 table[n],這裏 n 是 getn(table) 的結果(參見 6.1 節)。若是給定 comp,它就必須是一個函數能夠接受兩個表的元素,且返回 true (即,一個不一樣於 nil 的值)當第一個小於第二個的時候(因此 not comp(a[i+1], a[i]) 將爲 true 在排序以後)。若是 comp 沒有給定,那麼標準的 Lua 運算符 < 會被使用。
sort 算法不穩定(即,元素由給定的順序被認爲是相等的可能會被 sort 改變它們的相對位置)。

tag (v)
容許 Lua 程序測試一個值的標籤(參見 3 節)。它接受一個參數,返回它的標籤(一個數字)。

tonumber (e [, base])
嘗試把它的參數轉換爲一個數字。若是參數已是一個數字或者是一個能夠轉換爲數字的字符串,它返回那個數字;不然,返回 nil。
一個可選的參數指定解釋數字時的 base 。base 能夠是 2 到 36 之間的任意整數(含 2 和 36)。若是 base 大於 10,字母 `A' (大小寫都可)表明 10 ,`B' 表明 11,以此類推,`Z' 表明 35 。在 base 爲 10 (默認的)時,數字能夠有一個小數部分,以及一個可選的指數部分(參見 4.2 節)。在其它的 base 的狀況下,只可接受無符號整型。
tostring (e)
函數能夠接受一個任何類型的值做爲參數,並以一個合理的格式把它轉化爲字符串。可使用函數 format 來徹底控制數字如何轉換。

tinsert (table [, pos] , value)
在 table 的位置 pos 插入元素,若是須要的話,移動其它的元素來開闢空間。pos 的默認值是 n+1,這裏 n 是 getn(table)(參見 6.1 節)的結果,因此一個調用 tinsert(t,x) 會在表 t 尾部插入 x 。這個函數也會設置或者增長表的字段 n 爲 n+1。這個函數和下面的 Lua 函數等價,除了使用表時所有爲 raw (即,不喚起標籤方法):
lua

    function tinsert (t, ...)
      local pos, value
      local n = getn(t)
      if arg.n == 1 then
        pos, value = n+1, arg[1]
      else
        pos, value = arg[1], arg[2]
      end
      t.n = n+1;
      for i=n,pos,-1 do
        t[i+1] = t[i]
      end
      t[pos] = value
    end

tremove (table [, pos])
在 table 的位置 pos 移除元素,若是須要的話,移動其它的元素來整合空間。返回移除元素的值。pos 的默認值是 n,這裏 n 是 getn(table)(參見 6.1 節)的結果,因此一個調用 tremove(t) 會移除表 t 尾部元素 。這個函數也會設置或者減小表的字段 n 爲 n-1。
這個函數和下面的 Lua 函數等價,除了使用表時所有爲 raw (即,不喚起標籤方法):
調試

    function tremove (t, pos)
      local n = getn(t)
      if n<=0 then return end
      pos = pos or n
      local value = t[pos]
      for i=pos,n-1 do
        t[i] = t[i+1]
      end
      t[n] = nil
      t.n = n-1
      return value
    end

type (v)
函數容許 Lua 測試一個值的類型。它接受一個參數,返回它的類型,以一個字符串表示。這個函數可能的返回值是:
「nil」 (一個字符串,不是 nil 值),「number」, 「string」,「table」, 「function" 和 "userdata"。
(未完待續)

code

相關文章
相關標籤/搜索