2010-10-24 84 views
1

試圖讀取一個簡單的test.txt文件,並在文本和整數讀入數組後操作。這個想法是能夠從單獨的Person類中使用/需要attr_accessor。 所以我可以使用:名稱,:hair_color,:性別使用attr_reader讀取製表符分隔文件和分隔數組文件的策略

比如讓說,我們有我們的文本文件,該文件是全部由標籤分隔符分隔,急促我只是用空間:

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 

我很確定它更容易操縱逐行,而不是一個文件。之後我不知道該去哪裏。我知道我需要分開我的數據,如:姓名,:hair_color,:性別。拋出一些代碼,以便我可以嘗試一下。

回答

2

如果你讓你的initialize方法接受值namehair_colorgender,你可以做這樣的:

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>] 
+0

我忘了.map,doh!謝謝您的幫助! – Matt 2010-10-24 21:07:05

相關問題