(接上篇)函數
--------------------------------------
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
end
end
這個例子打印全部值非空的全局變量的名字
function printGlobalVariables ()
local i, v = nextvar(nil)
while i do
print(i)
i, v = nextvar(i)
end
end
-------------------
7.2 字符串操做
-------------------
這個例子去掉字符串先後的空白:
function trim(s)
local i = 1
while strsub(s,i,i) = ' ' do
i = i+1
end
local l = strlen(s)
while strsub(s,l,l) = ' ' do
l = l-1
end
return 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, ' ')
end
return s
end
-------------------
7.3 持久化
-------------------
因爲 Lua 的自反性,持久化在 Lua 中能夠用 Lua 實現。本節展現一些方法來存儲和恢復 Lua 中的值,用 Lua 寫成的文本文件做爲存儲媒介。
保存一個鍵值對,用下面的代碼就能夠了:
function store (name, value)
write('\n' .. name .. '=')
write_value(value)
end
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 .. '"')
end
end
爲了恢復這些值,一個 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)
end
end
函數 write_record 是:
function write_record(t)
local i, v = next(t, nil)
write('@{') -- starts constructor
while i do
store(i, v)
i, v = next(t, i)
if i then write(', ') end
end
write('}') -- closes constructor
end
-------------------
7.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)
{ lua_error ("too few arguments to function `max'"); return; }
/* and this argument must be a number */
if (!lua_isnumber(o))
{ lua_error ("incorrect arguments to function `max'"); return; }
dmax = lua_getnumber (o);
/* loops until there is no more arguments */
while ((o = lua_getparam(i++)) != 0)
{
if (!lua_isnumber(o))
{ lua_error ("incorrect arguments to function `max'"); return; }
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,爲這個語言起了個名字。
---------
-------------------
--------------------------------------oop