《七周七语言》的练习题,当前目录下有一个 RubyCSV.txt 的文件,文件内容是:
one, two
lion, tiger
写一段代码读文件,并支持如下操作:
csv = RubyCSV.new
csv.each {|row| puts row.one} # 打印one那一列
这是我的代码:
# -*- coding: utf-8 -*-
class CSVRow
def method_missing name, *args
puts name # <--------- 此句为了debug
row.key?(name.to_s) ? row[name.to_s] : nil
end
def initialize(headers, row)
@row = Hash[headers.zip(row)]
end
end
module CSVEnumerate
def each(&block)
csv_contents.each &block
end
end
class ActsAsCSV
include CSVEnumerate
def read
file = File.new(self.class.to_s.downcase + '.txt')
@headers = file.gets.chomp.split(', ')
file.each do |row|
@result << CSVRow.new(@headers, row.chomp.split(', '))
end
end
def headers
@headers
end
def csv_contents
@result
end
def initialize
@result = []
read
end
end
class RubyCSV < ActsAsCSV
end
这是测试代码:
csv = RubyCSV.new
csv.each {|row| puts row.one}
结果发现在 method_missing 处爆栈了,试着打印 name 参数(puts name 这一句),发现打印了无数条 row,说明一直在调用这个方法。可是代码中明明没有调用任何 row 方法啊?不知道是为什么。
请高手帮我看看错在哪里了。 谢谢:D