2014-10-12 2 views
2

Я смотрел на факториальную функцию lua, а часть, которую я не понимаю, - это почему «* n» в аргументе io.read ?? Я знаю, что io.read возвращает строковое значение, но что такое «* n» для? Это изменяет значение на число, но как оно работает? Я узнал, что я также могу сделать «число», так что он работает со всем, что есть * n .....?lua factorial, io.read читает номер

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

ответ

2

Единственный documented formats не являются:

  • нет Формат: Смотрите `«* л»
  • номер: читает строку до этого числа байтов, возвращая ноль в конце файла. Если число равно нулю, оно ничего не читает и возвращает пустую строку или nil в конце файла.
  • "*n": читает номер; это единственный формат, который возвращает число вместо строки.
  • "*a": считывает весь файл, начиная с текущей позиции. В конце файла возвращается пустая строка.
  • "*l": читает следующую строку, пропуская конец строки, возвращая нуль в конец файла. Это формат по умолчанию.
  • "*L": читает следующую строку, сохраняя конец строки (если присутствует), возвращая нуль в конце файла.

Глядя на источники (liolib.c, 424ff.), Реализация гораздо более терпимыми:

  1. Проверяет, есть ли аргумент и иначе читает строку.
  2. Проверяет значение типа «число», и в этом случае оно считывает указанное количество байтов.
  3. Преобразует аргумент в строку.
  4. Сравнивает первые два символа с документированными форматами, , не проверяя размер строк..

Последний пункт не является ошибкой для слишком маленьких строк (исключая, возможно, пустую строку), поскольку Lua-строки имеют 0-терминатор для интероперабельности, который не является частью длины.


Взглянув на "*n" -format, что это код для него:

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, используя формат LUA_NUMBER_SCAN (конфигурируемый, стандарт "%lf" см luaconf.h)
  2. Верните номер или nil на отказ.
Смежные вопросы