lua阶乘,io.read读取一个数字

我在看一个 Lua 的阶乘函数,我不明白的部分是为什么在 io.read 的参数中会有 "*n"?我知道 io.read 返回一个字符串值,但是 "*n" 代表什么呢?它会将值转换为数字,但它是如何运作的呢?我发现我也可以使用 "*number",所以它和任何以 *n 开头的都可以使用吗?

function fact(n)
    if n < 0 then
        return "undefine"
    elseif n==0 then
     return 1
     else
        return n * fact(n-1)
     end
end

print("Enter a number:")
a = io.read("*n") -- 读取一个数字 *n == *number
print(fact(a))
点赞
用户3204551
用户3204551

唯一的[记载的格式](http://www.lua.org/manual/5.2/manual.html#pdf-file:read)是:

  • 没有格式:见“*l”
  • 数字:读取具有最多此字节数的字符串,文件结束时返回nil。如果数字为零,则不读取任何内容并返回空字符串或文件结束时返回nil的空字符串。
  • “*n”:读取数字。这是唯一返回数字而不是字符串的格式。
  • “*a”:从当前位置开始读取整个文件。在文件结束时,返回空字符串。
  • “*l”:读取下一行并跳过换行符,在文件结束时返回nil。这是默认格式。
  • “*L”:读取下一行,保留换行符(如果存在),在文件结束时返回nil。

查看源代码(liolib.c, 424ff.),实现更加接受:

  1. 检查是否存在参数,否则读取一行。
  2. 检查类型为“数字”的值,此时它会读取指定数量的字节。
  3. 将参数转换为字符串。
  4. 将前两个字符与记录的格式比较,不检查字符串的大小

对于少于两个字符(不包括可能是空字符串)的字符串,最后一点不是错误,因为Lua字符串具有0终止符,以实现互操作性,这不是长度的​​一部分。


看一下“*n”格式的代码:

static int read_number (lua_State *L, FILE *f) {
  lua_Number d;
  if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) {
    lua_pushnumber(L, d);
    return 1;
  }
  else {
   lua_pushnil(L);  /* "result" to be removed */
   return 0;  /* read fails */
  }
}
  1. 尝试使用格式LUA_NUMBER_SCAN(可配置,标准为"%lf",请参见luaconf.h)使用fscanf读取数字。
  2. 在失败时返回数字或nil
2014-10-12 15:48:46