Ruby3日目
今回はメタプログラミングの話が主。RubyOnRailsにも興味があるので気になる話。
しかし、概要をサラッと流されているので深くは理解できず。
ただ、method_missingの話はおもしろい。
いかにRubyがプログラマに自由を与えているかのいい例だと思う。
(実際にこんなトリッキーな手法を使うかどうかは置いておいて。。。)
エラーの動作まで書き換えられる思想はすごい。
試してみよう
eachメソッドがCsvRowオブジェクトを返すようにCSVアプリケーションを変更せよ。そのCsvRowのmethod_missingを使って与えられた見出しの列を返すようにせよ。
#!/usr/bin/ruby
module ActsAsCsv
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def acts_as_csv
include InstanceMethods
end
end
module InstanceMethods
def each
@csv_contents.each do |contents|
yield contents
end
end
def read
@csv_contents = []
filename = self.class.to_s.downcase + '.txt'
file = File.new(filename)
@headers = file.gets.chomp.split(', ')
file.each do |row|
@csv_contents << CsvRow.new(row.chomp.split(',\
'), @headers)
end
end
attr_accessor :headers, :csv_contents
def initialize
read
end
end
end
class CsvRow
def initialize( content, headers )
@content = content
@headers = headers
end
def method_missing(name, *args)
idx = @headers.index(name.to_s)
if idx != nil
@content[idx]
end
end
end
class RubyCsv
include ActsAsCsv
acts_as_csv
end
m = RubyCsv.new
m.each{|row|puts row.one}
うえでは、method_missingはトリッキーとかいたけど、
こうやって見てみるとユーザ側のコードはかっこいいかも。
結局フレームワーク側で多少トリッキーなコードを書いても
ユーザのコードが見やすく生産性が上がればOKと言う発想なのかな?
0 件のコメント:
コメントを投稿