Если развернуть lhf правильный ответ , библиотека io
предпочтительна для производственного использования.
Функция print
в базовой библиотеке реализована как примитивная возможность. Он позволяет создавать быстрые и грязные сценарии, которые что-то вычисляют и печатают ответ, практически не контролируя его представление. Его основные преимущества заключаются в том, что он приводит все аргументы к string
и разделяет каждый аргумент в выводе с помощью табуляций и предоставляет новую строку.
Эти преимущества быстро становятся дефектами, когда требуется детальный контроль над выходом. Для этого вам действительно нужно использовать io.write
. Если вы смешаете print
и io.write
в одной программе, вы можете отключиться из-за другого дефекта. print
явно использует дескриптор файла C stdout
. Это означает, что если вы используете io.output
для изменения дескриптора выходного файла, io.write
будет делать то, что вы ожидаете, но print
не будет.
Хорошим компромиссом может быть реализация замены для print
в терминах io.write
. Это может выглядеть так же просто, как в этом непроверенном примере, где я пытался писать четко, а не оптимально, и по-прежнему обрабатывать nil
аргументы «правильно»:
local write = io.write
function print(...)
local n = select("#",...)
for i = 1,n do
local v = tostring(select(i,...))
write(v)
if i~=n then write'\t' end
end
write'\n'
end
Как только вы реализуете свою собственную версию print
, может возникнуть соблазн улучшить ее другими способами для вашего приложения. Использование чего-либо с большим контролем форматирования, чем предлагается tostring()
, является хорошей идеей. Другой рассматривает разделитель, отличный от символа табуляции.