首页 > 代码库 > Lua1.1 Lua 的参考手册 (三)

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,为这个语言起了个名字。
---------
-------------------
--------------------------------------

Lua1.1 Lua 的参考手册 (三)