6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Kernel#ppのHash表示を新記法(>1.9)に変える

Last updated at Posted at 2016-05-21

TL;DR

Kernel#pp(Pretty Print)で表示するHashオブジェクトについて、キーがシンボルのものを以下のような古い記法(ハッシュロケット形式)から新しい記法へ変える方法を紹介します。

古い記法(ハッシュロケット)
{ :font_size => 10, :font_family => "Arial" }
新しい記法(Ruby1.9以上)
{ font_size: 10, font_family: "Arial" }

問題意識

特にirbpryでは、変数のオブジェクト内容を表示することが多いですが、表示が必ずハッシュロケット形式の古い記法になってしまっていて、新記法派の人はモヤモヤしていました。
出力をコピペするときも、ペースト先で新記法へ直す必要がありました(一括置換する方法もありましたね)。

解決方法

そこで、HashオブジェクトがKernel#ppで表示される時に呼ばれる、Hash#pretty_printメソッドを設定することで新記法表示となるようにします。

具体例

先に具体的な表示の違いを見てみましょう。

古い記法(ハッシュロケット形式)

pry
[1] pry(main)> { a: 0, b: "b", c: { :ca => :ca, cb: {}, "(`・ω・´)": [], "cd": "cd" * 20 }, "d" => :d, "e-f": :ef }
=> {:a=>0,
 :b=>"b",
 :c=>
  {:ca=>:ca,
   :cb=>{},
   :"(`・ω・´)"=>[],
   :cd=>"cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"},
 "d"=>:d,
 :"e-f"=>:ef}

新しい記法へ変更すると

pry
[1] pry(main)> { a: 0, b: "b", c: { :ca => :ca, cb: {}, "(`・ω・´)": [], "cd": "cd" * 20 }, "d" => :d, "e-f": :ef }
=> {
  a: 0,
  b: "b",
  c: {
    ca: :ca,
    cb: {},
    "(`・ω・´)": [],
    cd: "cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd"
  },
  "d" => :d,
  "e-f": :ef
}

スッキリしました。コピペしても大丈夫ですね。
なお、シンボル型のキーの場合は、元の記法に関わらずできるかぎり新記法で表示しようとします。

また、改行可能な位置(breakable point)も少し調整したので、見やすくなっていると思います。

実現方法(変更方法)

実現は簡単です。以下のファイルを作ってrequireします。ファイル名は任意です。

hash_pretty_print.rb
require 'pp'
class Hash
  def pretty_print(q)
    if empty?
      q.text '{}'
      return
    end
    q.group 2, '{' do
      q.breakable
      q.seplist self do |k,v|
        if k.is_a? Symbol
          if k.inspect[1] === '"'
            q.text %|"#{k}": |
          else
            q.text "#{k}: "
          end
        else
          q.pp k
          q.text ' => '
        end
        if v.is_a? Enumerable
          q.pp v
        else
          q.group 1 do
            q.breakable ''
            q.pp v
          end
        end
      end
    end
    q.breakable
    q.text '}'
  end
end

irbpryでは、実行時に指定すると良いでしょう。

% irb -r./hash_pretty_print
% pry -r./hash_pretty_print

他にもRuby on Railsでは、#{Rails.root}/config/initializers/hash_pretty_print.rbなどに置いておけば、rails consoleでも自動的に読み込まれますね。

よかったら使ってみてください。
Enjoy ruby life!

参考

6
0
0

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
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?