TL;DR
Kernel#pp
(Pretty Print)で表示するHashオブジェクトについて、キーがシンボルのものを以下のような古い記法(ハッシュロケット形式)から新しい記法へ変える方法を紹介します。
{ :font_size => 10, :font_family => "Arial" }
{ font_size: 10, font_family: "Arial" }
問題意識
特にirb
やpry
では、変数のオブジェクト内容を表示することが多いですが、表示が必ずハッシュロケット形式の古い記法になってしまっていて、新記法派の人はモヤモヤしていました。
出力をコピペするときも、ペースト先で新記法へ直す必要がありました(一括置換する方法もありましたね)。
解決方法
そこで、Hash
オブジェクトがKernel#pp
で表示される時に呼ばれる、Hash#pretty_print
メソッドを設定することで新記法表示となるようにします。
具体例
先に具体的な表示の違いを見てみましょう。
古い記法(ハッシュロケット形式)
[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}
新しい記法へ変更すると
[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
します。ファイル名は任意です。
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
irb
やpry
では、実行時に指定すると良いでしょう。
% 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!