Стратегия чтения файла с разделителями табуляции и разделения файла для массива с помощью attr_reader - PullRequest
1 голос
/ 25 октября 2010

Попытка взять простой файл test.txt и отделить текст и целые числа после его чтения для манипулирования массивом.Идея состоит в том, чтобы иметь возможность использовать / требовать attr_accessor из отдельного класса Person.Таким образом, я могу использовать: name,: hair_color,: sex

Например, позволяет говорит, что мы имеем в нашем текстовом файле, который все разделены разделителем табуляции, для краткости я просто использовал пробел:

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,: пол.Брось какой-нибудь код, чтобы я мог попробовать.

1 Ответ

2 голосов
/ 25 октября 2010

Если вы заставите ваш метод 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>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...