Lua1.1 Lua 的參考手冊 (三)

(接上篇)函數

--------------------------------------
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

相關文章
相關標籤/搜索