Вот (возможно, дикая) идея: используйте класс Struct вместо того, чтобы использовать свой собственный простой класс POD. Но от этого вы хотите иметь конструктор, который принимает все аргументы, которые могут быть сгенерированы из данных файла.
Line = Struct.new(:field1, :field2, :field3)
Тогда в основе алгоритма вы хотите что-то вроде:
File.open("test.csv").lines.inject([]) do |result, line|
result << Line.new(line.split(",", Line.length))
end
или быть немного более кратким и функциональным:
lines = File.open("test.csv").lines.map { |line| Line.new(line.split(",", Line.length)) }
Честно говоря, я не очень много использовал класс Struct, но я должен это делать, и я, вероятно, буду реорганизовывать материал, уже написанный для его использования. Это позволяет вам получить доступ к переменным по их именам, таким как:
Line.field1 = blah
Line.field2 = 1
Рубин Структура класс.
Таким образом, чтобы на самом деле ответил на ваш вопрос , и, посмотрев выше на код, я бы сказал, что было бы намного проще использовать collect / map для выполнения вычислений. Функция map вместе с inject очень мощная, и я считаю, что использую их довольно часто.