こんにちは!ゆきまさです!!(@yyykms)
今回はRubyのprintとputsとpのメソッドの違いについて紹介したいと思います。
Rubyには変数や値などをコンソールに出力するためのメソッドとして、「print」「puts」「p」などのメソッドが用意されています。
「print」と「puts」と「p」のメソッドはいずれも引数に渡された値などを出力しますが、微妙に挙動が違います。
この他にも出力系のメソッドがいくつか存在しますが、今回は「print」「puts」「p」に絞って紹介していきます。
主な違い
主な違いとしては以下の様な点があります。
- 改行するかしないか
- オブジェクトの情報も出力するか
「puts」と「p」は出力した後に改行するのですが、「print」は改行しません。
「puts」と「p」はいずれも改行するのですが、「p」メソッドはオブジェクトの情報も出力します。
printメソッド
- 引数を順番に出力する
- 改行をしない
- 文字列以外のオブジェクトは、to_s メソッドによって文字列に変換される
- 改行を入れる場合は改行文字(\n)を付ける
- 戻り値はnil
printメソッドはオブジェクトの出力後に改行を加えません。
また引数が数値などの場合は文字列に変換されます。
print 123, 'abc'
print "abc\ndef"
#=> 123abc
#=> abc
#=> def
array = [111, 222, 333]
print array
#=> [111, 222, 333]
hash = {"name" => "山田", "age" => 25}
print hash
#=> {"name" => "山田", "age" => 25}
putsメソッド
- 引数を順番に出力する
- 改行をする
- 文字列以外のオブジェクトは、to_s メソッドによって文字列に変換される
- 配列の場合は要素を順番に出力する
- 戻り値はnil
putsメソッドはオブジェクト出力後の末尾に改行が入ります。
また配列の場合は中の要素を出力します。
puts 123
puts 'abc'
puts "abc\ndef"
#=> 123
#=> abc
#=> abc
#=> def
array = [111, 222, 333]
puts array
#=> 111
#=> 222
#=> 333
hash = {"name" => "山田", "age" => 25}
puts hash
#=> {"name" => "山田", "age" => 25}
pメソッド
- 引数を順番に出力する
- 改行をする
- オブジェクトを見やすいように出力する
- \nや\tなどのエスケープ文字もそのまま出力する
- 戻り値は引数で配列で返す
- 主にデバッグで使用される
pメソッドは主にデバック用で、オブジェクトと型表現も含めた形の文字列を出力し、末尾に改行が入ります。
文字列を出力するとダブルクォートで囲まれますが、数値はそのまま出力されます。
pメソッドは内部的にinspectメソッドを呼び出しています。
p 123
p 'abc'
p "abc\ndef"
"abc\ndef".inspect
#=> 123
#=> "abc"
#=> "abc\ndef"
#=> "\"abc\ndef\""
array = [111, 222, 333]
p array
#=> [111, 222, 333]
hash = {"name" => "山田", "age" => 25}
p hash
#=> {"name" => "山田", "age" => 25}
まとめ
以上がRubyの「print」「puts」「p」メソッドの違いでした!
ここまでの内容を簡単にまとめると
- 「print」は、引数を文字列にして出力し、改行をいれない
- 「puts」は、引数を文字列にして出力し、改行をいれる
- 「p」は、引数を読み取りやすい形式で出力し、改行をいれる。デバッグでよく使用する。
似た様な出力系のメソッドでも微妙に違いがあってなかなか難しかったです。
また、他の出力系のメソッドもあるので気になる人は調べて見てください!