1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Ruby】putsと$stdout.putsの違い

1
Posted at

はじめに

こんにちは!アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
本日はputs$stdout.putsの違いについて説明していきたいと思います。
Rubyを使っているとき、よく目にする puts。そしてあまり見かけない $stdout.puts
これらはどちらも「標準出力」に文字列を出力するために使われますが、実は微妙な違いがあります。
それぞれ見ていきましょう。

puts とは

puts は、Rubyで最も基本的な出力メソッドの一つです。現在の $stdout に文字列を出力します。
通常、Rubyプログラムを実行したときの「標準出力」とはターミナルの画面を指します。

以下の例を見てください。

puts "Hello, World!" # ターミナルに "Hello, World!" を表示

この場合、puts はデフォルトでターミナル(STDOUT)に「Hello, World!」と出力します。

$stdout.puts とは

$stdout は、Rubyにあらかじめ定義されているグローバル変数で、現在の標準出力を指します。
$stdout.puts は、この $stdout オブジェクトに対して直接 puts を呼び出す形式です。

以下は puts$stdout.puts の基本的な使い方です。

puts "Hello, World!"        # ターミナルに "Hello, World!" を表示
$stdout.puts "Hello, World!" # 同じ結果を表示

動作は似ていますが、両者の違いは $stdout をリダイレクト(出力先を変更)したときに顕著になります。

違いが出るケース:$stdout のリダイレクト

リダイレクトとは?

リダイレクトとは、標準出力の出力先を変更することです。
通常、puts はターミナル画面に出力されますが、リダイレクトを使うとターミナル以外の場所(例: ファイルや仮想ファイル)に出力を切り替えることができます。

具体例を見てみましょう。


require 'stringio'

# ログ用の仮想ファイルを用意
log = StringIO.new

# $stdout をリダイレクト
$stdout = log

# 出力を確認
puts "This is puts"
$stdout.puts "This is $stdout.puts"

# $stdout を元に戻す
$stdout = STDOUT

# 結果の確認
puts "Log contents:"
puts log.string

実行結果

Log contents:
This is puts
This is $stdout.puts

コードの動作解説

  1. $stdout を仮想ファイルにリダイレクト
    $stdout = log$stdout を仮想ファイル(StringIO オブジェクト)にリダイレクトしています。この時点から、puts の出力先がターミナルではなく仮想ファイルになります。

  2. puts の動作
    puts$stdout を経由するため、現在の $stdout(仮想ファイル)に "This is puts" を書き込みます。

  3. $stdout.puts の動作
    $stdout.puts$stdout オブジェクトの puts メソッドを直接呼び出して、仮想ファイルに "This is $stdout.puts" を書き込みます。

  4. $stdout を元に戻す
    $stdout = STDOUT$stdout を標準の出力先(ターミナル)に戻します。

  5. ログ内容を確認
    仮想ファイル(log)に蓄積された内容を log.string で取得し、ターミナルに出力します。

リダイレクトなしの場合

リダイレクトを行わない場合の動作を確認してみましょう。

puts "This is puts"
$stdout.puts "This is $stdout.puts"

出力結果

This is puts
This is $stdout.puts

この場合、puts$stdout.puts のどちらもデフォルトの $stdout(STDOUT オブジェクト)を通じてターミナルに直接出力されるため、記述された順番通りに表示されます。

$stdout を操作するメリット

では、わざわざ $stdout を操作して出力先を変更するメリットは何でしょうか?
以下に $stdout のリダイレクトが役立つ具体例を示します。

テストやデバッグに活用

たとえば、プログラムの動作確認やログ収集のために出力内容を一時的にログとして保存したい場合、以下のように $stdout をリダイレクトすると便利です。

require 'stringio'

log = StringIO.new
$stdout = log

puts "Test log: Something happened."
$stdout = STDOUT

puts "Captured log:"
puts log.string

出力結果

Captured log:
Test log: Something happened.

仮想ファイルに出力を切り替えることで、テストの動作確認やデバッグの効率を向上させられます。

まとめ

  • puts$stdout.puts は通常同じ挙動ですが、リダイレクトを行うと違いが顕著になります。
  • $stdout をリダイレクトすることで、出力先を仮想ファイルや別のストリームに柔軟に切り替えることが可能です。
  • テストやログ収集の際に $stdout を操作することで、プログラムの動作確認やデバッグを効率化できます。
    注意点として、リダイレクトは一時的な変更であるため、必ず元の $stdoutSTDOUT)に戻すことを忘れないようにしましょう!
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?