LoginSignup
19
19

More than 5 years have passed since last update.

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

Last updated at Posted at 2012-07-09

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 さんです。

19
19
3

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
19
19