If you're happy with a fixed format (you could build the format dynamically depending on the maximum data width in each field) you could write something like this.
class FamilyMember
attr_accessor :name, :sex, :type, :role, :age
def initialize (*args)
@name, @sex, @type, @role, @age = args
end
end
fm = []
fm << FamilyMember.new( 'Andrew', 'Male', 'Child', 'Son' , '27' )
fm << FamilyMember.new( 'Bill', 'Male', 'Parent', 'Father', '63' )
fm << FamilyMember.new( 'Samantha', 'Female', 'Parent', 'Mother', '62' )
fm << FamilyMember.new( 'Thomas', 'Male', 'Child', 'Dog' , '10' )
fm << FamilyMember.new( 'Samantha', 'Female', 'Child', 'Dog' , '4' )
format = '%-15s %-8s %-7s %-7s %-7s %s'
puts format % ['Family Member', 'Name', 'Sex', 'Type', 'Role', 'Age']
fm.each_with_index do |member, i|
puts format % [ i+1, member.name, member.sex, member.type, member.role, member.age ]
end
output
Family Member Name Sex Type Role Age
1 Andrew Male Child Son 27
2 Bill Male Parent Father 63
3 Samantha Female Parent Mother 62
4 Thomas Male Child Dog 10
5 Samantha Female Child Dog 4
You can also use for ... in
, which actually compiles to pretty much the same loop, using the each
iterator.
i = 0
for member in fm do
i += 1
puts format % [ i, member.name, member.sex, member.type, member.role, member.age ]
end
or you can use the primitive while
or until
loop constructs, which most Ruby programmers forget about. Ruby is much more expressive using its iterators.
i = 0
while member = fm[i] do
i += 1
puts format % [ i, member.name, member.sex, member.type, member.role, member.age ]
end
Note that you can omit the do
from both of these last examples. As long as you have a newline (or a semicolon) after the while
expression Ruby will understand just fine.