为什么第二个指令在第一个指令之前被评估?

Why is the second instrution evaluated before the first one?

我正在做一些计算以用作我将要在 PCCG Stack Exchange 上 post 的问题的测试用例,我注意到在这样的一段代码中:

for i = 0, 20 do
    io.write(i..": ")
    diff(i)
end

(其中 diff 是一个执行大量计算并打印结果的函数),首先计算 diff 的结果,然后才计算 i:diff 的结果被打印出来。

但是为什么会这样呢?我不应该在计算之前和期间看到 i: ,并且只有在之后才能看到计算结果吗?为什么之前要等diff执行?

我第一次注意到这个是使用 Luajit,但它也发生在 vanilla Lua 甚至在 for 循环之外。

正如许多其他语言中的许多其他输出函数一样,io.write 输出是缓冲的。它经过评估,只是您的输出现在位于中间缓冲区中,等待刷新或填充此缓冲区。如果您需要立即处理数据,请添加 io.flush() 调用。