Lua io.write() 添加不必要的材料到输出字符串中

当我启动一个交互式 Lua shell 时,io.write() 会在我想要打印的字符串后添加不必要的材料。然而,print() 并不会:

[user@manjaro lua]$ lua
Lua 5.4.2  版权所有 (C) 1994-2020 Lua.org, PUC-Rio
> io.write('hello world')
hello worldfile (0x7fcc979d4520)
> print('hello world')
hello world

当我在程序中使用 io.write() 时,它也可以正常工作:

--hello.lua
io.write('hello world\n')
print ('hello world')

输出结果:

[user@manjaro lua]$ lua hello.lua
hello world
hello world

我在 Dell 台式计算机上使用 Manjaro Linux。有人能告诉我这是怎么回事吗?提前感谢。

编辑:我应该补充一点,可能不必要的材料始终是这样的:

file (0x7f346234d520)

它总是以'file'开头,后面跟着看起来像大括号中包含大量十六进制数字的内容。在一个 shell 会话中,确切的数字保持不变,但在不同的 shell 会话之间会有所不同。

点赞
用户459640
用户459640

"file (0x7fcc979d4520)"(或任何其他地址)是 io.write 调用的返回值,具有隐式的 tostring

lua(1) 手册中写道:

在交互模式下,lua 提示用户从标准输入读取行,并在读取时执行这些行。如果该行包含一个表达式或表达式列表,则该行将被计算并打印结果。

问题在于,io.write('hello world') 可能是表达式,也可能是语句。由于它是有效的表达式,解释器输出了不需要的返回值。

解决方法是尝试添加一个分号:

> io.write('hello world\n');
hello world

尽管 Lua 通常不要求在每个语句后面加分号(如果它在行末),但它允许。这里的重点是,它意味着语法不能是表达式,只能是调用函数的语句。因此,解释器不会输出返回值。

2021-04-10 12:09:08
用户1211859
用户1211859

你只是在手动交互式调用 io.write 时看到了它的返回值。在使用 Lua shell 的时候,几乎总是打印出你调用的任何函数的返回值。 file(blabblah) 是你正在写入的文件的内部表示(可能只是一个十六进制的内存地址,但谁知道呢?)。

你只是在手动交互式调用 `io.write` 时看到了它的返回值。在使用 Lua shell 的时候,几乎总是打印出你调用的任何函数的返回值。
`file(blabblah)` 是你正在写入的文件的内部表示(可能只是一个十六进制的内存地址,但谁知道呢?)。
2022-10-18 17:57:57