Lua1 1 Lua 的參考手冊 (三)

2022-08-16 12:06:12 字數 3171 閱讀 6281

**出處:

(接上篇)

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。本章簡...