web-dev-qa-db-ja.com

同じ行にLua印刷

Pascalには、writewritelnがあります。どうやらLuaのprintはPascalのwritelnに似ています。 Pascalのwriteに似たものはありますか?連続した印刷コマンドはどのようにして同じ行に出力を送信できますか?

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

出力:

Hello
world

これが欲しい:

Hello world
33
AlexStack

使用する io.write代わりにprintを使用します。これはとにかく、デバッグなどの単純な使用を目的としています。

71
lhf

lhfの正解 を展開すると、ioライブラリーが実稼働での使用に適しています。

基本ライブラリのprint関数は、プリミティブ機能として実装されています。プレゼンテーションをほとんど制御することなく、何かを計算して回答を出力する、迅速で汚いスクリプトを使用できます。その主な利点は、すべての引数をstringに強制し、出力の各引数をタブで区切り、改行を提供することです。

出力の詳細な制御が必要な場合、これらの利点はすぐに欠陥になります。そのためには、本当に_io.write_を使用する必要があります。同じプログラムでprintと_io.write_を混在させると、別の欠陥につまずく可能性があります。 printは、C stdoutファイルハンドルを明示的に使用します。つまり、_io.output_を使用して出力ファイルハンドルを変更すると、_io.write_は期待どおりに動作しますが、printは動作しません。

適切な妥協案は、printの代わりに_io.write_を使用して実装することです。この未テストのサンプルと同じように単純に見えるかもしれませんが、私は最適化ではなく明確に記述しようとし、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()で提供されるよりも多くのフォーマット制御を備えたものを使用することは、良いアイデアです。別の方法では、タブ文字以外の区切り文字を検討しています。

21
RBerteig

別の方法として、文字列を作成し、単一のprintを使用してそれを書き出すだけです。

ioライブラリに常にアクセスできるとは限りません。

6
sylvanaar

「Hello」と「World」に変数を使用できます。その後、それらを連結します。このような:

local h = "Hello"
local w = "World"

print(h..w)

この場合、「HelloWorld」として表示されます。しかし、それは簡単に修正できます。これが役に立てば幸いです!

4
Searous