質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1251閲覧

Rubyのp,puts,printの表示タイミングの違いは何ですか?

.ke

総合スコア1

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2021/09/28 08:18

Rubyで出力する際の、p,puts,printの表示タイミングの違いは何ですか?

処理に時間がかかるプログラムを組んでいて、今何をしているのかを明確にしたいので、処理の最初と最後に標準出力を出したいです。
pだと、思い通りに表示されるのですが、puts,printで表示すると、最後に一気に表示されます。
ダブルクォーテーションなしで表示したいので、putsかprintを使用したいのですが…。

調べてみましたが、
pは型の表現あり(改行もあり)、putsは改行あり、printは改行なし
等の違いがあることは出てくるのですが、表示されるタイミングの違いは出てきませんでした。
表示のタイミングの違いはあるのでしょうか?

ソースは以下の様な形です。

Ruby

1HASH = {"hoge1" => 1, "hoge2" => 2} 2 3HASH.each do |hoge,num| 4 5 puts "start" 6 7 # 処理A 8 def shoriA(hikisuu1, hikisuu2) 9 puts "shoriA start" 10 # ここに時間がかかる処理がある 11 puts "shoriA end" 12 end 13 14 # 処理Aの呼び出し 15 shoriA("hikisuu1", "hikisuu2") 16 shoriA("hikisuu3", "hikisuu4") 17 shoriA("hikisuu5", "hikisuu6") 18 19 puts "end" 20 21end

上記はputsで記載しましたが、puts,printの場合は、初めの数分は何も表示されず、

start
shoriA start
shoriA end
shoriA start
shoriA end
shoriA start
shoriA end
end

と一気に表示されます。

pの場合(上記ソースのputsをpに変えただけ)は、

"start"
"shoriA start"

が表示されて、時間がたって

"shoriA end"

が表示されます。(以降も同じように表示される)

ソースは同じなのに、挙動(表示のタイミング)が違う理由が知りたいです。
また、pの表示タイミングで、"で囲われていない表示を行うにはどうすればよいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/09/28 12:12

普通の端末に出力する場合は、そうならないはずですが、何か特殊な実行環境でしょうか? あるいは、普通の端末でもパイプで別のプログラムにつないだとか?
.ke

2021/10/05 03:00

普通はならないんですね…。 端末は普通の端末ですが、プログラム内でGitLabからデータを取得している箇所があります。だからでしょうか?
otn

2021/10/05 13:17

プログラムの中のことは(バッファリングの変更処理以外は)関係ないです。 普通の端末は、(変更しない限り)行単位のバッファリングなので、改行を出力すると端末画面に現れます。 そうならないとすると、自覚がないとしても、特殊な環境です。
guest

回答1

0

ベストアンサー

コンソール出力にはバッファリングといって、「ある程度貯まってから出力する」という仕組みが存在します。pはデバッグ用なので、バッファリングを無視するようになっているのかもしれません。

バッファリングを止めたい場合、最初にSTDOUT.sync = trueのように実行しておく方法があります。

投稿2021/09/28 08:23

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

.ke

2021/09/28 08:31

なるほど。そういうことだったんですね! 最初に'STDOUT.sync = true'を記載したら、上手くいきました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問