読者です 読者をやめる 読者になる 読者になる

第4回 YokohamaRuby その1

Ruby

第4回、YokohamaRubyが開催されたので行ってきました。

YokohamaRubyは決まったテーマがあるわけではなく、各自それぞれ興味を持ったものを持ち寄ってひとり黙々とコードを書いたり、輪読したり。

僕は改めてRubyを勉強したいということから初心者セッションに参加。参考書籍は「初めてのRuby」

今日は@dan5yaさん含めて3名、事前にひと通り参考書籍を読んでいることから、@dan5yaさんが出されたテーマを黙々と解くことに。

まずは「

a = ["a" , "abc" , "abcdef"]と定義されている時、
     a
   abc
abcdef
と出力せよ。

もともとCな人で、今はJavaな僕が書いたコードは次のような感じ。

a = ["a", "abc", "abcdef"]

max = 0
a.each do |i|
   max = i.size if i.size > max
end

a.each do |i|
   p sprintf("%*s", max, i)
end

eachが二つあるのがイケテナイよなぁ・・・。ということで、更に考えてみた。最大の桁数を求めるためにはどうすればいいんだろうと考え、ひねり出した答えがこれ。

max = a.max { |i,j| i.length <=> j.length }

で、さらにRubyらしい答えがこちら。

a = %w(a abc abcdef)

max = a.map{ |i| i.size }.max

a.each do |i|
   p i.rjust(max)
end

Ruby 1.8.7以降だったらmaxを求める部分はこう書ける。

max = a.map(&:size).max

これはSymbol#to_procを使ったもの。元々はRailsにて実装されたものとのこと。

聞いたときは「ふぅん」って思ったんだけど、これを使うとローカル変数のスコープ問題が解決するので、結構便利かと。

前回の横浜Rubyでも言われたことですが、Rubyにとってmapは使いこなせないといけない必須アイテムみたいな感じだな。

次の記事に続きます。