第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は使いこなせないといけない必須アイテムみたいな感じだな。
次の記事に続きます。