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

3
我在查看一个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") -- reads a number *n == *number
print(fact(a))
1个回答

4

唯一已记录的格式为:

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

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

  1. 检查是否有参数,否则读取一行。
  2. 检查值的类型是否为“number”,如果是,则读取指定数量的字节。
  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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接