【问题标题】:Lua print on the same lineLua 打印在同一行
【发布时间】:2011-11-01 04:44:26
【问题描述】:

在 Pascal 中,我有 writewriteln。显然 Lua 的 print 类似于 Pascal 的 writeln。我们有类似 Pascal 的write 的东西吗?连续的打印命令如何将它们的输出发送到同一行?

print("Hello")
print("World")

输出:

Hello
world

我想要这个:

Hello world

【问题讨论】:

  • 它是 Lua,而不是 LUA

标签: lua


【解决方案1】:

使用io.write 而不是print,这意味着简单的用途,例如调试,无论如何。

【讨论】:

  • 嗯,这就是为什么@lhf 是 Lua 语言的创造者之一。 :)
【解决方案2】:

lhf's correct answer 的基础上扩展,io 库更适合生产使用。

基础库中的print 函数作为原始功能实现。它允许快速而肮脏的脚本计算某些东西并打印答案,而几乎无法控制其呈现。它的主要优点是它将所有参数强制转换为string,并用制表符分隔输出中的每个参数并提供换行符。

当需要对输出进行详细控制时,这些优势很快就会变成缺陷。为此,您确实需要使用io.write。如果您在同一个程序中混合使用printio.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)
      

      【讨论】:

        猜你喜欢
        • 2022-10-23
        • 2016-08-18
        • 2018-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多