TOPシステム開発> 第3回:Rubyスクリプトを動かそう!(3/3)

いまさら聞けないRuby入門

いまさら聞けないRuby入門

第3回:Rubyスクリプトを動かそう!

著者:伊藤忠テクノソリューションズ  大場 光一郎

公開日:2007/12/21(金)

並べ替え

次にカンマ区切りのデータを並べ替えてみましょう。行頭から4番目の身長データを使って背が低い順に並べてみます。今回は並べ替えのためにsortメソッドを使いました(リスト4)。

リスト4には「加工するための対象となるデータ」と「データを加工するメソッド」があります。これらを「第2回:Rubyを動かそう!」で解説したようにクラスを使ってひとまとめにして、管理しやすくしてみましょう(リスト5)。

これでデータがクラスの中に整理され、操作の難しいところも隠蔽されました。処理の流れがわかりやすくなったのではないでしょうか。

実習2

背の高い順やemailのアルファベット順などいろいろソート条件を変えてみましょう。sortの他に名前だけを抽出するメソッドなども追加してみましょう。

リスト4:csv_sort.rb
CSV_DATA = <<EOS
01,太郎,taro@foo.com,156
02,花子,hanako@foo.com,155
03,次郎,jiro@foo.com,164
04,三郎,saburo@foo.com,142
05,二郎,saburo@foo.com,180
EOS

data = CSV_DATA.split("\n") # 改行毎に配列に変換

data.sort! do |one, another|
  one = one.split(',')         # 1行を配列に変換
  another = another.split(',') # 1行を配列に変換
  one[3] <=> another[3] # 配列は0から数えるので4番目のデータは[3]でアクセス
end

puts data

リスト5:クラス化したcsv_sort.rb
class Address
  CSV_DATA = <<EOS
01,太郎,taro@foo.com,156
02,花子,hanako@foo.com,155
03,次郎,jiro@foo.com,164
04,三郎,saburo@foo.com,142
05,二郎,saburo@foo.com,180
EOS

  def initialize
    @data = CSV_DATA.split("\n")
  end

  def sort
    @data.sort! do |one, another|
      one = one.split(',')
      another = another.split(',')
      one[3] <=> another[3]
    end
  end
end

address = Address.new
puts address.sort

リスト6:csv_sort_file.rb
class Address
  def initialize
    data = nil
    open('address.csv') do |file|
      data = file.readlines
    end
    @data = data
  end

  def sort
    @data.sort! do |one, another|
      one = one.split(',')
      another = another.split(',')
      one[3] <=> another[3]
    end
  end
end

address = Address.new
puts address.sort

ファイル処理

カンマ区切りのデータをクラスの中に定義しましたが、これではデータだけ更新したいときに不便です。そこでデータは外部ファイルにしてRubyスクリプトと独立させてみましょう。

Rubyでファイルを扱うにはopenを使います。openもブロックを使って内容を読み取ります。データファイルaddress.csvという名前でスクリプトと同じフォルダに保存しました(リスト6)。

リスト5と比べてみてください。クラスにしたおかげでAddressクラスを利用する側を変更することなくクラスの中身の書き換えでファイル処理に対応できました。このようにクラスは、インターフェースを変更させずにプログラムの動作を変えやすくしてくれるのです。

実習3

データのファイル名を簡単に変更したり、いろんなファイルを入力できるようにファイル名をパラメータ化してみましょう。また、sortに引数を渡して何番目の要素を使って並べ替えるのかを指定できるようにしてみましょう。

Ruby入門のまとめ

オブジェクト指向言語のRubyを生かせるようにオブジェクト指向のエッセンスを取り混ぜながらRubyを紹介してきました。しかし、Rubyは懐の深い言語です。手続き型のようにも、関数型のようにも記述することができます。

この特徴を利用して本連載では処理を順番に並べる手続き型のプログラムを例示した後に、クラスを使ったオブジェクト指向プログラミングについて解説するよう努めてきました。処理の流れとクラスによるオブジェクトの振る舞いについて、対比することで理解の助けになれば幸いです。

Rubyには他にも継承やモジュールを使った処理の共通化やユニットテスト、分散オブジェクトなどが用意されおり、標準添付のクラスライブラリだけでもさまざまなことができます。ぜひ興味のある分野に取り組んでみてください。

Ruby on Railsの隆盛によって常に注目を集めているRubyですが、今だからこそプログラミング言語Rubyそのものを学んで基礎固めしておきたいですね!


前のページ  1  2  3


伊藤忠テクノソリューションズ株式会社 大場 光一郎
著者プロフィール
伊藤忠テクノソリューションズ株式会社  大場 光一郎
社内のRuby推進に従事。個人的にBookScopeの開発に協力する傍ら、オープンソースへの活動としてMeadowプロジェクトに参加したり、JRubyの開発に協力したりしている。最近、Java Expert #02へJRubyの記事を書いた。

Meadow
http://www.meadowy.org/meadow/
BookScope
http://bookscope.net/
暮らしの業
http://ko.meadowy.net/~koichiro/diary/


INDEX
第3回:Rubyスクリプトを動かそう!
  Rubyスクリプトを作ろう
  データの加工
並べ替え