lua factorial,io.read读取数字

时间:2014-10-12 15:23:59

标签: io lua

我正在看一个lua阶乘函数,我不明白的部分是为什么io.read参数中有“* n”?我知道io.read返回一个字符串值,但是什么是“* n”?它将值更改为数字,但它是如何工作的?我发现我也可以做“*号”,所以它适用于任何* 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 个答案:

答案 0 :(得分:2)

唯一的documented formats是:

  • 没有格式:见`&#34; * l&#34;
  • number:读取最多为此字节数的字符串,在文件末尾返回nil。如果number为零,则它什么都不读,并返回一个空字符串,或者在文件末尾返回nil。
  • "*n":读取一个数字;这是返回数字而不是字符串的唯一格式。
  • "*a":从当前位置开始读取整个文件。在文件末尾,它返回空字符串。
  • "*l":读取跳过行尾的下一行,在文件末尾返回nil。这是默认格式。
  • "*L":读取保留行尾的下一行(如果存在),在文件末尾返回nil。

查看来源(liolib.c,424ff。),实施更加接受:

  1. 检查是否有参数,否则读取一行。
  2. 检查类型&#34;数字&#34;的值,在这种情况下,它会读取指定的字节数。
  3. 将参数转换为字符串。
  4. 将前两个字符与记录的格式进行比较,不检查字符串大小。
  5. 最后一点不是太小字符串的错误(可能不包括空字符串),因为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. 尝试使用格式为fscanf的{​​{1}}读取数字(可配置,标准为LUA_NUMBER_SCAN,请参阅"%lf"
    2. 返回号码或luaconf.h失败。