web-dev-qa-db-ja.com

ブール変数を使用してlua文字列をフォーマットする方法は?

書式設定された文字列で表示する値を持つブール変数があります。 string.formatを使用してみましたが、 言語リファレンス にリストされているフォーマットオプションを選択すると、次のようになります。

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初心者にとっては間接的なようです。見落としている書式設定オプションはありますか?または、上記のアプローチを使用する必要がありますか?他に何か?

32

string.formatのコードを見ると、ブール値をサポートするものは何もありません。その場合、tostringが最も妥当なオプションだと思います。

37
Omri Barel

Lua 5.1では、valが文字列または数値以外の場合、string.format("%s", val)ではvaltostring( )で手動でラップする必要があります。

ただし、Lua 5.2では、_string.format_自体が新しいC関数_luaL_tolstring_を呼び出します。これは、valtostring( )を呼び出すのと同等です。

20
dubiousjim

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"
9