たのしいRuby(第2版) 「はじめてのRuby」〜putsメソッド、pメソッド〜

■これは「たのしいRuby 第2版」を元にしています。
Amazon CAPTCHA

putsメソッド

 putsメソッドは、printメソッドとは異なり、表示する文字列の最後で必ず改行します。

なるほど、改行してくれるのですね。やってみましょう。

  • コード
puts "Hello,Ruby!"
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
Hello,Ruby!

おお、改行が1つ追加されて、出力されました。


ただし、引数を分けて渡した場合、

  • コード
puts("Hello,","Ruby!")
C:\enjoy_ruby>ruby helloruby.rb
Hello,
Ruby!


となる。


pメソッド

オブジェクトの内容を表示するときに便利な「p」というメソッドです。数値の"1"を、printメソッドやputsメソッドで表示させると、どちらも単に「1」と表示されてしまいます。これでは本当はどちらのオブジェクトなのか、表示結果から確認できません。

なるほど、これは便利ですね。さっそくやってみましょう。

  • プログラム
p 1
p "1"

数値と文字列をセットしてみました。どうなるでしょうか。

  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
1
"1"

おおおぉ、分かりやすいですね!printメソッドのときは、文字列でも""はついていませんでしたから、分かりにくかったですね。
最後は1行改行されるようですね。

では、以前分かりにくくて悩んでいた部分を、pメソッドで解消してみましょう。


printメソッドは、文字列以外のオブジェクトが引数として渡された場合は、当該オブジェクトを to_s メソッドにより文字列に変換してから出力します。とありました。
では、printメソッドをpメソッドの引数として渡した場合どうなるのでしょう?

  • プログラム
p(print(1))
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
1nil

うーん。数値で表示されました。しかもnilが出力されました。


これでは、「1」というオブジェクトはpメソッドにより出力され、printメソッドにはなにもオブジェクトが渡らなかったような感じがして、さらにpメソッドの影響で改行したという感じです。


僕のイメージでは、printメソッドがオブジェクト1を評価して、"1"になり、それをpメソッドが評価して、"1"を出力すると思っていました・・・。
ちょっと違うのですね・・・。


もっとpメソッド

 このように、文字列を出力する場合、「""」で囲んで表示してくれるわけです。これなら一目瞭然ですね。さらに、文字列の中に含まれる改行やタブなどの特殊文字も、「\n」や「\t」のように表示されます。

とりあえず、やってみましょう。

  • プログラム
puts "Hello,\n\tRuby!"
p "Hello,\n\tRuby!"
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
Hello,
       Ruby!
"Hello,\n\tRuby!"

なるほど、より詳しく表示されますね。

なお、もう少し後で紹介しますが、「配列オブジェクト」や「ハッシュオブジェクト」などのオブジェクトを表示させるときにも、printメソッドよりpメソッドの方が内容を確認しやすい形で表示できます。
printメソッドは、実行結果やメッセージなどを普通に表示したいとき、pメソッドは実行中のプログラムの様子を確認したいとき、と使い分ければよいでしょう。

ふむふむなるほど。

原則として、pメソッドはプログラムを書いている人のためのメソッドなのです。

なるほどー。


ちょっと先走って、配列の例を出力してみましょう。

  • プログラム
p [1,2,3,"a","b","c"]
print [1,2,3,"a","b","c"]
  • 実行結果
C:\enjoy_ruby>ruby helloruby.rb
[1, 2, 3, "a", "b", "c"]
123abc


なるほど、pメソッドの方が配列だ!と分かりますね、printの方は文字列が並んでいるようにしか見えません。



環境

C:\enjoy_ruby>ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]