2017-09-28 12 views

答えて

2

あなただけの値のシーケンスを印刷したい場合は、あなたがprintとすることを行うことができます。

print(variable, 'String: %s ', str, 'Word: %d', w) 

何がしたいように見えるが、何かもっと複雑です。

  1. 各引数について::あなたのアルゴリズムがあるように思わ
    1. 引数が文字列でない場合は、文字列に変換し、それを印刷します。
    2. 引数が文字列の場合、それに含まれるパターンの数を確認します(kとします)。 string.formatに現在の引数文字列と次のkパラメータを渡し、結果の文字列を出力します。 Advance kのパラメータ。 1行のシステムで行うことができるよりもはるかに複雑なアルゴリズムだ

。あなたは正しいです

function Log(...) 
    local values = {} 

    local params = table.pack(...) 

    local curr_ix = 1 
    while (curr_ix <= params.n) do 
     local value = params[curr_ix] 
     if(type(value) == "string") then 
      --Count the number of `%` characters, *except* for 
      --sequential `%%`. 
      local num_formats = 0 
      for _ in value:gmatch("%%[^%%]") do 
       num_formats = num_formats + 1 
      end 

      value = string.format(table.unpack(params, curr_ix, num_formats + curr_ix)) 

      curr_ix = curr_ix + num_formats 
     end 

     values[#values + 1] = value 
     curr_ix = curr_ix + 1 
    end 

    print(table.unpack(values)) 
end 
+0

これは非常に興味深いです。私は、各ログのフラグを割り当てることによって、もう一つ加えました。ログ(エラー、...)ログ(情報、...)ログ(デバッグ、...)追加のパラメータを持つことにより、冗長性を制御することができました。あなたの助けを借りて+1 –

+0

このループ 'for _ in value:gmatch(" %% [^ %%] ")do'は連続パーセントをスキップしようとしているにもかかわらず文字列' "5 %% less" 'にマッチします。 –

1

string.formatの最初の引数は、残りの引数ではなく、書式指定子を必要とするため、現在のアプローチは機能しません。

とにかく、これは書式設定と一緒に印刷を結合する方法である:

Log = function(...) 
    return print(string.format(...)) 
end 

そして、このようにそれを呼び出します。また、形式を作るために良いかもしれない

Log("String: %s Number: %d", 'hello' , 42) 

より明示的な引数を使用し、printの代わりにio.writeを使用して、印刷の制御を強化してください。

function Log(fmt, ...) 
    return io.write(string.format(fmt, ...)) 
end 
+0

@NicolBolas、今固定:

Luaの5.3を使用するには、ここではそのような機能は、(:やっとテストコード注)次のようになります。 –

+0

形式を指定することは一般的な解決策ではありません。私のコード例はかなり基本的ですが、考え方は完全に汎用的です。Logger –

関連する問題