**出處:
(接上篇)
7 一些例子
本段給出一些顯示 lua 特性的例子。它並不打算覆蓋完整的語言,只是顯示一有趣的使用。
7.1 函式 next 和 nextvar
這個例子顯示如何使用函式 next 去遍歷乙個表的字段:
function f (t) -- t is a table
local i, v = next(t, nil) -- i is an index of t, v = t[i]
while i do
-- do something with i and v
i, v = next(t, i) -- get next index
endend
這個例子列印所有值非空的全域性變數的名字
function printglobalvariables ()
local i, v = nextvar(nil)
while i do
print(i)
i, v = nextvar(i)
endend
7.2 字串操作
這個例子去掉字串前後的空白:
function trim(s)
local i = 1
while strsub(s,i,i) = ' ' do
i = i+1
endlocal l = strlen(s)
while strsub(s,l,l) = ' ' do
l = l-1
endreturn strsub(s,i,l)
end這個例子去掉字串所有的空白:
function remove_blanks (s)
local b = strfind(s, ' ')
while b do
s = strsub(s, 1, b-1) .. strsub(s, b+1)
b = strfind(s, ' ')
endreturn s
end7.3 持久化
由於 lua 的自反性,持久化在 lua 中可以用 lua 實現。本節展示一些方法來儲存和恢復 lua 中的值,用 lua 寫成的文字檔案作為儲存媒介。
儲存乙個鍵值對,用下面的**就可以了:
function store (name, value)
write('\n' .. name .. '=')
write_value(value)
endfunction write_value (value)
local t = type(value)
if t = 'nil' then write('nil')
elseif t = 'number' then write(value)
elseif t = 'string' then write('"' .. value .. '"')
endend
為了恢復這些值,乙個 lua_dofile 就足夠了。
儲存表有點複雜。假定表是一棵樹,所有下標均為識別符號(也就是說,表被用作記錄),表的值可以用表的建構函式寫成。
首先,把函式 write_value 改為
function write_value (value)
local t = type(value)
if t = 'nil' then write('nil')
elseif t = 'number' then write(value)
elseif t = 'string' then write('"' .. value .. '"')
elseif t = 'table' then write_record(value)
endend
函式 write_record 是:
function write_record(t)
local i, v = next(t, nil)
write('@') -- closes constructor
end7.4 乙個 cfunction
乙個 cfunction 用來計算最大的數字引數可以寫成:
void math_max (void)
int i=1; /* number of arguments */
double d, dmax;
lua_object o;
/* the function must get at least one argument */
if ((o = lua_getparam(i++)) == 0)
/* and this argument must be a number */
if (!lua_isnumber(o))
dmax = lua_getnumber (o);
/* loops until there is no more arguments */
while ((o = lua_getparam(i++)) != 0)
if (!lua_isnumber(o))
d = lua_getnumber (o);
if (d > dmax) dmax = d;
/* push the result to be returned */
lua_pushnumber (dmax);
使用下面的函式註冊:
lua_register ("max", math_max);
這個函式就可以由 lua 呼叫了,如下:
i = max(4, 5, 10, -34) -- i receives 10
7.5 呼叫 lua 函式
這個例子顯示乙個 c 函式如何呼叫乙個 7.2節中展示的 lua 函式 remove_blanks。
void remove_blanks (char *s)
lua_pushstring(s); /* prepare parameter */
lua_call("remove_blanks", 1); /* call lua function with 1 parameter */
strcpy(s, lua_getstring(lua_pop())); /* copy result back to 's' */
鳴謝作者要感謝 cenpes/petrobrobas 和 tecgraf 一起,使用該系統的早期版本,並提出寶貴意見。作者還要感謝 carlos henrique levy,為這個語言起了個名字。
InnoDB中文參考手冊 11表和索引結構
innodb 中文參考手冊 犬犬 心帆 翻譯11表和 索引結構 在目錄下的.frm檔案中儲存它的資料字典資訊。但是每個 innodb型別表也同樣在 innodb表空間內的內部的資料字典中存在它自己的進入點。當mysql移除 drop 乙個表或乙個資料庫時,它將同時刪除.frm檔案,以及在 innod...
晶元參考手冊和資料手冊的區別
有關產品技術特徵的基本描述,包含產品的基本配置 如內建flash和ram的容量 外設的數量等 管腳的數量和分配,電氣特性,封裝資訊,和定購 等。有關如何使用該產品的具體資訊,包含各個功能模組的內部結構 所有可能的功能描述 各種工作模式的使用和暫存器配置等詳細資訊。通常在晶元選型的初期,首先要看資料手...
bash參考手冊之三(基本的Shell特性)
3 基本的shell特性 bash是bourne again shell的縮寫。bourne shell是傳統的unix shell程式,最初是由史蒂芬 伯恩編寫的。所有bourne shell的內建命令在bash中都可用。評價和引用的規則是基於posix規範的 標準 的unix shell。本章簡...