Tom*_*Tom -1 ruby arrays formatting multidimensional-array string-conversion
我正在尝试将2D数组输出到控制台; 我希望数组中的信息格式正确,如我在本问题末尾所需的输出中所示.我的数组创建如下(实例是由FamilyMember类创建的):
#family_members.rb
class FamilyMember
attr_accessor :name, :sex, :status, :age
def initialize (name, sex, type, role, age)
@name = name
@sex = sex
@type = type
@role = role
@age = age
end
end
# Below, an array is created called fm; instances of the class are then instantiated within the array elements
fm = {}
fm[1] = FamilyMember.new('Andrew','Male', 'Child', 'Son' , '27' )
fm[2] = FamilyMember.new('Bill','Male', 'Parent', 'Father' , '63' )
fm[3] = FamilyMember.new('Samantha','Female', 'Parent', 'Mother' , '62' )
fm[4] = FamilyMember.new('Thomas','Male', 'Child', 'Dog' , '10' )
fm[5] = FamilyMember.new('Samantha', 'Female', 'Child', 'Dog' , '4' )
Run Code Online (Sandbox Code Playgroud)
我希望能够将数组的内容输出到格式化为字符串的控制台.我需要能够做到这两种方式 - 使用each和单独使用do.
我尝试过的(受前一个SO问题的启发):
def eacharray(an_array)
an_array.each do |inner|
puts inner.join(" ")
end
end
eacharray(fm)
Run Code Online (Sandbox Code Playgroud)
但是上面的输出结果如下:
1 #<FamilyMember:0x000000027e7d48>
2 #<FamilyMember:0x000000027e7c58>
3 #<FamilyMember:0x000000027e7b68>
4 #<FamilyMember:0x000000027e7a78>
5 #<FamilyMember:0x000000027e7988>
Run Code Online (Sandbox Code Playgroud)
如何使用each和输出格式良好的2D数组元素do?任何帮助赞赏.谢谢.
理想情况下,我的输出将是这样的:
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
Run Code Online (Sandbox Code Playgroud)
如果您对固定格式感到满意(您可以根据每个字段中的最大数据宽度动态构建格式),您可以编写类似这样的内容.
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
Run Code Online (Sandbox Code Playgroud)
产量
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
Run Code Online (Sandbox Code Playgroud)
您也可以使用迭代器for ... in来实际编译到几乎相同的循环each.
i = 0
for member in fm do
i += 1
puts format % [ i, member.name, member.sex, member.type, member.role, member.age ]
end
Run Code Online (Sandbox Code Playgroud)
或者您可以使用大多数Ruby程序员忘记的原语while或until循环结构.Ruby使用它的迭代器更具表现力.
i = 0
while member = fm[i] do
i += 1
puts format % [ i, member.name, member.sex, member.type, member.role, member.age ]
end
Run Code Online (Sandbox Code Playgroud)
请注意,您可以省略这do两个最后一个示例.只要你有一个换行符(或分号)后while表达式Ruby就会理解得很好.