Help us understand the problem. What is going on with this article?

pに一工夫加えて見やすくする

More than 5 years have passed since last update.

Rubyの便利な機能の一つにpがあります。よく分からないものはとりあえずpして内容を確認します。

p1.rb
# 何でも表示出来る
p 1          #=> 1
p 1.5        #=> 1.5
p "str"      #=> "str"
p Time.now   #=> 2012-07-02 01:12:42 +0900

個人的に不便な所が一つあって、複数の値をカンマ区切りで渡すと改行区切りで出力されてしまいます。一行にまとめて表示したい時はどうすればよいのでしょうか。

p2.rb
x = 1
y = "2"
z = 3.0

# まとめて表示!!
p x, y, z

# 改行されて表示されてしまう・・
# 1
# 2
# 3.0

配列リテラルで囲むと1行で表示出来る

そのような時は関連する値を配列リテラルで囲んでしまいましょう。

p3.rb
p [x, y, z]

# 一行で表示出来る!
# [1, "2", 3.0]

また、ハッシュリテラルを使えば名前付きで表示することも出来ます。
文法的な理由によりハッシュ渡しの時は括弧を省略出来ないことに注意して下さい。

p4.rb
p ({:x=>x, :y=>y, :z=>z})

# 名前付きで表示
# {:x=>1, :y=>2, :z=>3.0}

# Ruby1.9ならJavaScriptと同じ書き方でも書けます
p ({x: 1, y: 2, z: 3.0})

応用:必要な値を絞り込んで表示する

応用として、ライブラリ等で提供される大きなオブジェクト(ここでは大量のプロパティやメソッドが存在しているもののことを差す)から、今確認したい値だけを絞り込んで表示することを考えてみます。

p5.rb
# 応用、クラスから必要なメンバだけを表示する
require 'stringio'
io = StringIO.new "A String"

# 望まない結果
p io                            # #<StringIO:0x0000010084e6c0>

# 表示したいプロパティを配列リテラルで囲む
p [io.string, io.size, io.pos]  # ["A String", 8, 0]

# 名前付き
p ({:string => io.string, :size => io.size, :pos => io.pos} ) #=> {:string=>"A String", :size=>8, :pos=>0}

io.string, io.size, io.pos それぞれ個別にpするよりも見やすくなりました。

※ 前日は y_uuki_さんのVimで快適なRailsライフをでした! 明日は sora_h さんです。

ongaeshi
ソースコード検索アプリのMilkodeとかを作っています。 ブログ http://ongaeshi.hatenablog.com/
http://ongaeshi.me/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away