あざらし備忘録。

渋谷ではたらく音ゲー大好きウェッブエンジニアがいろいろ思った事やった事を書いていくブログです

columnizeを使ってみた[Ruby][irb][Gem]

あけましておめでとうございます!

新年一発目はライトな話題から...

今回はcolumnizeというgemを触ってみてあったら便利な時もありそうだなーと思ったので備忘録として。

rocky/columnize · GitHub

どんなgem?

このgemは簡単に言うと配列の中身を見やすく整形してくれるgemです!

デバッグ時などに便利そうなgemですね。

pryでもirbでも問題なく使えたので、そのあたりと組み合わせると幸せになれるかも?

ちなみにgemを知ったきっかけは BestGems -- Ruby Gems Download Ranking をぼーっと見ていて目に止まったからです!

いや〜このサービスは便利+見ていて楽しいですねwありがとうございます!

ちなみにこのcolumnizeはtotalランキング122位でした。

インストール

gem columnize

こちらをGemfileに記述してbundle install --path vendor/bundleするか、gemに直接インストールしてしまいましょう。

おしまいです:)

使い方

早速使ってみます。

columnize_sample|⇒ bundle exec irb
irb(main):001:0> require 'columnize'
=> true

requireしてあげることでcolumnizeが有効になります。

当たり前ですがpryを用いてbinding.pry等を行うときは、requireをbinding.pryする以前にrequireしておいてあげればそのまま使用することが可能です。

irb(main):002:0> a = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
irb(main):003:0> a.columnize
=> "1  2  3  4  5  6  7  8  9  10"

columnizeをrequireするとarrayにcolumnizeというメソッドが生えるようになります。

実行すると上記の様に配列が文字列に展開されたような形になります。

この展開の方式をオプションによって変えて、それをputsで表示することで配列をフォーマットしてよしなな形で見れるようにしよう、というのがcolumnizeの趣旨です。

irb(main):004:0> puts a.columnize :displaywidth => 10
1  5   9
2  6  10
3  7
4  8
=> nil
irb(main):005:0> puts a.columnize :displaywidth => 20
1  3  5  7   9
2  4  6  8  10
=> nil

:displaywidthオプションをつけると表示文字列の一行あたりの最大文字数を指定することが可能です。

ちょっとわかりにくいかもしれませんが、例えば一つ目の例での:displaywidth => 10だと、1行あたり10文字まで表示できる状態でいい感じに表示してくれます。このいい感じにっていうのがなかなか賢いですね!2 6 10の並びは8文字ですが、10を指定してもこの様に表示してくれます。

:displaywidth => 20を指定すると、先ほどまでは10文字の制限があって表示できなかった2 4 6 8 10(14文字)を表示できるようになるわけです。

(ちょっと挙動がわかりにくいのは内緒な)

irb(main):006:0> puts a.columnize :arrange_array => true, :displaywidth => 20
[1, 2, 3,  4, 5, 6,
 7, 8, 9, 10]
=> nil

:arrange_array => trueを指定すると、配列の形で吐き出してくれます。

irb(main):007:0> g = %w(bibrons golden madascar leopard mourning suras tokay)
=> ["bibrons", "golden", "madascar", "leopard", "mourning", "suras", "tokay"]
irb(main):008:0> puts g.columnize :displaywidth => 15
bibrons   suras
golden    tokay
madascar
leopard 
mourning
=> nil

中身が文字列でもOKです。

irb(main):009:0> puts g.columnize :displaywidth => 19, :colsep => ' | '
bibrons  | mourning
golden   | suras   
madascar | tokay   
leopard 
=> nil

:colsep => <区切り文字として利用したい文字列>とすると、それで列の間を区切ってくれます。 レイアウトをそのままにしたい場合はcolsepの文字数分displaywidthの値を上手く増やす必要があります。(このへんももう少しよしなにできたらなおよさそう)

irb(main):062:0> puts g.columnize :displaywidth => 19, :colsep => ' | ', :ljust => false
 bibrons | mourning
  golden |    suras
madascar |    tokay
 leopard
=> nil
irb(main):063:0> puts g.columnize :displaywidth => 19, :colsep => ' | ', :ljust => true
bibrons  | mourning
golden   | suras   
madascar | tokay   
leopard 
=> nil

:ljustオプションによって左揃えかどうかを選択できます。デフォルトはfalseに設定されています。

irb(main):011:0> Columnize.columnize(a)
=> "1  2  3  4  5  6  7  8  9  10"
irb(main):012:0> puts Columnize.columnize(a, :displaywidth => 10)
1  5   9
2  6  10
3  7
4  8
=> nil

クラスメソッドとして呼ぶことも可能です。

ちなみにputsしないで見てみるとこんな感じです。

irb(main):071:0> g.columnize :displaywidth => 18, :colsep => ' | ', :ljust => true
=> "bibrons  | suras\ngolden   | tokay\nmadascar\nleopard \nmourning"

終わりに

実データっぽいものをサクッと扱いたいときなどに知っていると楽ができそうだなぁという印象のgemでした!

今回の物は割りと有名そうでしたが、このようにいろんなパッと出会ったgemを触ってコードも読んでみたりするのも楽しそうだなと感じました!

gem reading習慣の機運?w