並べ替え
次にカンマ区切りのデータを並べ替えてみましょう。行頭から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そのものを学んで基礎固めしておきたいですね!