如何使用布尔变量格式化 lua 字符串?

Posted

技术标签:

【中文标题】如何使用布尔变量格式化 lua 字符串?【英文标题】:How to format a lua string with a boolean variable? 【发布时间】:2011-09-30 17:30:25 【问题描述】:

我有一个布尔变量,我想在格式化字符串中显示它的值。我尝试使用string.format,但对于language reference 中列出的任何格式选项选择,都会得到类似以下内容:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print(string.format("%c\n", true))
stdin:1: bad argument #2 to 'format' (number expected, got boolean)
stack traceback:
    [C]: in function 'format'
    stdin:1: in main chunk
    [C]: ?

我可以通过添加tostring 来显示布尔值,

> print(string.format("%s\n", tostring(true)))
true

但这对这个 lua 初学者来说似乎相当间接。有没有我忽略的格式化选项?还是我应该使用上述方法?还有什么?

【问题讨论】:

为什么要使用 string.format?为什么不只是 print(tostring(true)) 你也可以不格式化nil,function,thread,userdata... @Jane T 因为它是较长字符串的一部分,所以示例被缩减到最低限度。 没关系,那么是的,你需要使用 tostring。 @sylvanaar - 这就是我正在寻找的信息——你能指出记录在哪里吗? 【参考方案1】:

查看string.format 的代码,我没有看到任何支持布尔值的东西。 我猜tostring 在这种情况下是最合理的选择。

例子:

print("this is: " .. tostring(true))  -- Prints:   this is true

【讨论】:

【参考方案2】:

在 Lua 5.1 中,如果 val 不是字符串或数字,string.format("%s", val) 要求您手动将 val 包装为 tostring( )

然而,在 Lua 5.2 中,string.format 将自己调用新的 C 函数 luaL_tolstring,这相当于在 val 上调用 tostring( )

【讨论】:

【参考方案3】:

您可以重新定义 string.format 以支持在参数上运行 tostring 的附加 %t 说明符:

do
  local strformat = string.format
  function string.format(format, ...)
    local args = ...
    local match_no = 1
    for pos, type in string.gmatch(format, "()%%.-(%a)") do
      if type == 't' then
        args[match_no] = tostring(args[match_no])
      end
      match_no = match_no + 1
    end
    return strformat(string.gsub(format, '%%t', '%%s'),
      unpack(args,1,select('#',...)))
  end
end

有了这个,您可以将%t 用于任何非字符串类型:

print(string.format("bool: %t",true)) -- prints "bool: true"

【讨论】:

以上是关于如何使用布尔变量格式化 lua 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Java生态/Redis中如何使用Lua脚本

lua里面如何require一串lua格式的字符串

如何使用 String.Format 将布尔类型转换为“ON”“OFF”

Redis入门 - Lua脚本

什么是布尔变量,要如何使用?

如何在 URL 中传递 false 的布尔变量