Lua 打印在同一行
Posted
技术标签:
【中文标题】Lua 打印在同一行【英文标题】:Lua print on the same line 【发布时间】:2011-11-01 04:44:26 【问题描述】:在 Pascal 中,我有 write
和 writeln
。显然 Lua 的 print
类似于 Pascal 的 writeln
。我们有类似 Pascal 的write
的东西吗?连续的打印命令如何将它们的输出发送到同一行?
print("Hello")
print("World")
输出:
Hello
world
我想要这个:
Hello world
【问题讨论】:
它是 Lua,而不是 LUA。 【参考方案1】:使用io.write
而不是print
,这意味着简单的用途,例如调试,无论如何。
【讨论】:
嗯,这就是为什么@lhf 是 Lua 语言的创造者之一。 :)【参考方案2】:在lhf's correct answer 的基础上扩展,io
库更适合生产使用。
基础库中的print
函数作为原始功能实现。它允许快速而肮脏的脚本计算某些东西并打印答案,而几乎无法控制其呈现。它的主要优点是它将所有参数强制转换为string
,并用制表符分隔输出中的每个参数并提供换行符。
当需要对输出进行详细控制时,这些优势很快就会变成缺陷。为此,您确实需要使用io.write
。如果您在同一个程序中混合使用print
和io.write
,您可能会遇到另一个缺陷。 print
显式使用 C stdout
文件句柄。这意味着如果您使用io.output
更改输出文件句柄,io.write
将执行您所期望的操作,但 print
不会。
一个好的折衷办法是用io.write
替换print
。它可能看起来像这个未经测试的示例一样简单,我试图清楚地而不是优化地编写并且仍然“正确”处理 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()
提供更多格式控制的东西是一个好主意。另一个正在考虑使用制表符以外的分隔符。
【讨论】:
这也可以写成function print(...) io.write(table.concat(...,"\t"),"\n") end
,代价是创建一个表并执行一个连接。
但前提是所有参数都是字符串或数字,因为table.concat
在表的每个元素上调用lua_isstring()
...与基础库print
相比,它在每个元素上调用tostring
参数传递。
@Rberteig:你为什么使用 select("#",...) 而不仅仅是#arg?
arg
表是 Lua 5.0 的一个特性,在 5.1 中存在但已弃用,它仅在函数中引用时才存在。引用它会导致创建一个新表,因为...
是一个非常特殊的值,它不是表。此外,select('#',...)
得到正确的长度,即使某些参数是 nil
而#arg
可能不是。【参考方案3】:
作为替代方案,只需构建您的字符串,然后使用单个 print
将其写出来
您可能无法始终访问io
库。
【讨论】:
如果您无权访问io
库,为什么还要访问print
?
因为您可能处于嵌入式环境,或其他重新定义print
的受限环境中。以魔兽世界为例。
感谢您的回答。很容易忘记这种方法的存在。【参考方案4】:
您可以为“Hello”和“World”使用变量。然后稍后将它们连接起来。像这样:
local h = "Hello"
local w = "World"
print(h..w)
在这种情况下,它将显示为“HelloWorld”。但这很容易解决。希望这有帮助!
【讨论】:
【参考方案5】:添加到@Searous 的答案,尝试以下操作。
本地 h = "你好" 本地 w = "世界"
打印(h.." "..w)
您可以将两者连接在一起,只需在两个变量之间连接一个空格。
【讨论】:
【参考方案6】:local h = "Hello"
local w = "World!"
print(h, w)
【讨论】:
以上是关于Lua 打印在同一行的主要内容,如果未能解决你的问题,请参考以下文章