2017-02-10 2 views
2

Я делаю немного чтения на Ruby. Как упрощен язык. Я пытался найти это и сам разобраться. Я ищу некоторую помощь с объектами и как я добавляю к нему данные. Я хочу создать объект под названием Athlete, где я прочитал его в формате .txt или .csv с их номером и именем Jersey.Добавление в Ruby Objects

class Athlete 
    def setNumber (jNum) 
    @mynum = jNum 
    end 

    def getNumber 
    return @mynum 
    end 

    def setName (jName) 
    @myname = jName 
    end 

    def getName 
    return @myname 
    end 
end 

Является ли это тем, как я создал класс?

Затем я прочитал в файле:

myAthlete = Athlete.new 

fileObj = File.new(uInput, "r") 
while (line = fileObj.gets) 
    jData = line.split(" ") 
    myAthlete.setNumber(jData.at(0)) 
    myAthlete.setName(jData.at(1)) 
end 
fileObj.close 

это где я начинаю получить немного потерял. Я знаю, что он отлично разделяет данные, потому что я уже пробовал это с помощью только Array.new. Говоря это, я пытаюсь сделать массив внутри класса Athlete. Может ли кто-нибудь помочь мне с этим?

Так что, если мой входной файл:

52 Sabathia 
19 Tanaka 
17 Holliday 
24 Sanchez 

Я хотел бы, чтобы ее разделить, а затем, если я позвоню позволяет говорить ухой myAthlete (1) было бы напечатать материал Танаки

ответ

5

Вещь в том, что Ruby объявляет о выходе из строя, насколько чистым является синтаксис и как много правил стиля Ruby управляются этим. Например, Ruby рекомендует использовать методы с get и set, вместо этого предпочитая такие вещи, как name и name= для методов доступа и мутаторов.

Да, у вас может быть = в конце имени метода, так же, как вы можете иметь ? или !, каждый из которых имеет значение для конкретных вещей.

Это также задание, что последняя операция, которую вы выполняете в методе, - неявно - возвращаемое значение, поэтому нет необходимости в return.

Вот простой рефакторинг кода с тем, что в виду:

class Athlete 
    def number 
    @number 
    end 

    def number=(value) 
    @number = value 
    end 

    def name 
    @name 
    end 

    def name=(value) 
    @name = value 
    end 
end 

Вы можете уменьшить это еще дальше, так как рубин имеет метод, который будет генерировать их для вас автоматически вызывается attr_accessor.Вы также можете сделать вашу жизнь немного легче, сделав initialize метод для заполнения этих:

class Athlete 
    attr_accessor :number 
    attr_accessor :name 

    def initialize(number, name) 
    @number = number 
    @name = name 
    end 
end 

Так, чтобы положить все это вместе:

athletes = [ ] 

File.readlines(input) do |line| 
    number, name = line.chomp.split(/\s+/) 

    athletes << Athlete.new(number, name) 
end 

Много рубинового кода использует блоки определить операции, которые должны произойти. В этом случае readlines вызывает этот блок для каждой строки, считанной из файла. Эти строки включают в себя строку \n в конце, которую удаляет chomp. << - это быстрый способ добавить что-то в массив.

Постарайтесь, чтобы ваши имена переменных и методов также были в нижнем регистре. Столицы имеют значительное значение в Ruby, поэтому jData должно быть jdata или j_data.

Update: Для того, чтобы сделать это более отладчик дружественный:

class Athlete 
    def inspect 
    "Athlete [%s] %s" % [ @number, @name ] 
    end 
end 
+0

Итак, я понимаю весь ваш код, как я могу получить информацию и сравнить спортсменов. Так что, если я хочу получить второго атлета (в моем «фиктивном» файле это будет «19 Танака»), какую строку я использую для этого? Что-то вроде спортсменов [1]? Я пробовал это, и я получаю '# ' есть больше чисел, которые, как я предполагаю, является указателем на то, где сохраняются данные. –

+0

Это просто обычный массив, поэтому 'athletes [1]' возвращает атлета в позиция индекса 1 (вторая запись). Это зависит от наличия двух строк в вашем файле, конечно. Если вы когда-либо были в тупике, попробуйте использовать 'p athletes' как быстрый способ показать вывод отладки на консоли или даже лучше использовать инструмент' irb' для запуска небольших фрагментов кода и проверки вывода. – tadman

+0

Я добавил небольшой фрагмент, который определяет 'inspect', поэтому ваш вывод выглядит более дружелюбным. Эти числа являются 'object_id' объекта, о котором идет речь, это только формат проверки по умолчанию. – tadman

3

Во-первых , вам не нужно определять явные getters/seters. Что-то, как это будет делать

class Athlete 
    attr_accessor :name, :number 

    def initialize(name, number) 
    self.name = name 
    self.number = number 
    end 
end 

Или еще короче:

Athlete = Struct.new(:name, :number) 

Тогда для создания спортсменов:

athletes = File.foreach(file_path).map do |line| 
    number, name = line.chomp.split(' ') 
    Athlete.new(name, number) 
end 

Теперь вы будете иметь массив полный Athlete с.

+0

Ой, спасибо так много! Позвольте мне попробовать. :) –

+0

@JohnBarr Обратите внимание, что в строке 'attr_accessor' отсутствовал': 'для' number'. Я исправил свой пост сейчас. –