尝试获取一个简单的test.txt文件,并在读入后将文本和整数分开以进行数组操作。我们的想法是能够使用/要求来自单独的Person类的attr_accessor。 所以我可以使用:name,:hair_color,:gender
例如,让我们说我们的文本文件中有一个由制表符分隔符分隔的,为简洁起见,我只使用了空格:
Bob red_hair 38
Joe brown_hair 39
John black_hair 40
我的课程会读到:
class Person
attr_accessor :name, :hair_color, :gender
def initialize
@place_holder = 'test'
end
def to_s
@test_string = 'test a string'
end
end
我的主要档案是我目前遇到的战略问题:
test_my_array = File.readlines('test.txt').each('\t') #having trouble with
我很确定逐行操作比使用一个文件更容易。我不确定那之后去哪儿。我知道我需要将我的数据分类为:name,:hair_color,:gender。抛出一些代码,这样我就可以尝试了。
答案 0 :(得分:2)
如果您使initialize
方法接受name
,hair_color
和gender
的值,则可以这样做:
my_array = File.readlines('test.txt').map do |line|
Person.new( *line.split("\t") )
end
如果您无法修改initialize
方法,则需要逐个调用编写器方法:
my_array = File.readlines('test.txt').map do |line|
name, hair_color, gender = line.split("\t")
person = Person.new
person.name = name
person.hair_color = hair_color
person.gender = gender
person
end
使初始化的最简单方法是接受属性作为参数,而不必自己设置所有变量,是使用Struct
,这会将整个代码缩短为:
Person = Struct.new(:name, :hair_color, :gender)
my_array = File.readlines('test.txt').map do |line|
Person.new( *line.split("\t") )
end
#=> [ #<struct Person name="Bob", hair_color="red_hair", gender="male\n">,
# #<struct Person name="Joe", hair_color="brown_hair", gender="male\n">,
# #<struct Person name="John", hair_color="black_hair", gender="male\n">,
# #<struct Person name="\n", hair_color=nil, gender=nil>]