プログラマ 福重 伸太朗 〜基本へ帰ろう〜 このページをアンテナに追加 RSSフィード

2008-06-13

たのしい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]

udud 2009/06/23 04:46 初めまして。googleでrubyのpとputsの違いを求めてやってきました。
rubyの表示メソッドに追記します。
日本語の表示が変ります。

$ cat t.rb
p "こんだけ"
print "こんだけ\n"
puts "こんだけ"

$ ruby t.rb
"\343\201\223\343\202\223\343\201\240\343\201\221"
こんだけ
こんだけ
$

mm 2013/10/28 12:57 こんな昔の記事に突っ込みして失礼します・・・

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

間違い。
迷い込んだ初心者が混乱するといけないので訂正を。

1. print(1)が1を出力して、戻り値にnilを返す
2. pはprintの戻り値であるnilを出力

printは改行が入らないので、両者の出力は同じ行に出ます。その結果

1nil

と表示されてる。

pは引数を戻り値に返す。
printはnilを返す。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/japanrock_pg/20080613/1213314138