2016-07-15 3 views
0

Учитывая следующий код:Возвращающиеся объекты из массива в рубин

class Person 
    attr_accessor :first_name, :last_name  
    @@people = [] 

    def initialize(first_name,last_name) 
    @first_name = first_name 
    @last_name = last_name 
    @@people.push(self) 
    end 

    def self.search(last_name) 
    @last_name = last_name #accept a `last_name` parameter 
    @@people.select { |person| person.last_name } 
    #return a collection of matching instances 
    end 

    #have a `to_s` method to return a formatted string of the person's name 
    def to_s 
    #return a formatted string as `first_name(space)last_name` 
    end 
end 

p1 = Person.new("John", "Smith") 
p2 = Person.new("John", "Doe") 
p3 = Person.new("Jane", "Smith") 
p4 = Person.new("Cool", "Dude") 

puts Person.search("Smith") 

# Should print out 
# => John Smith 
# => Jane Smith 

Что мне нужно сделать, чтобы вернуть выход под Should print out бит? Я могу получить его, чтобы вернуть идентификатор объекта:

#<Person:0x007fa40c04cd08> 
#<Person:0x007fa40c04c920> 
#<Person:0x007fa40c04c5d8> 
#<Person:0x007fa40c04c5b0> 

Одна проблема, которую я вижу с этим, даже не зная, что в каждом из них: там должно быть только два значения, возвращаемые. Таким образом, часть поиска также неверна.

Что мне делать с этим?

+0

Вы должны реализовать 'Person # to_s', чтобы делать то, что говорит комментарий, - *" # вернуть отформатированную строку как first_name (пробел) last_name "* - затем повторить над тем, что возвращает 'Person # search', и вызывается' Person # to_s' для каждого объекта. –

+0

Также ваш метод поиска неверен. – andrewkday

ответ

1
class Person 
     attr_accessor :first_name, :last_name 
     @@people = [] 

     def initialize(first_name,last_name) 
     @first_name = first_name 
     @last_name = last_name 
     @@people.push(self) 
     end 

     def self.search(last_name) 
     @@people.select { |person| person.last_name == last_name } 
     #return a collection of matching instances 
     end 

     #have a `to_s` method to return a formatted string of the persons name 
     def to_s 
     "#{self.first_name} #{self.last_name}" 
     end 
    end 

    p1 = Person.new("John", "Smith") 
    p2 = Person.new("John", "Doe") 
    p3 = Person.new("Jane", "Smith") 
    p4 = Person.new("Cool", "Dude") 

    puts Person.search("Smith").collect(&:to_s) 

Я изменил метод self.search, чтобы выбрать объекты, которые имеют ту же фамилию и, очевидно, метод to_s + то, что получает тушит. Прочитайте тест и дайте мне знать, если у вас есть другие вопросы.

+0

Спасибо. Я вижу, что, помимо того, что я еще ничего не делал с методом 'to_s' (я ожидал, чтобы выяснить, как перенести только два ожидаемых значения возврата), я не правильно сравнивал' person.last_name' с '@ last_name' в' self.search'. Благодаря тому, что это правильно, я теперь получаю только два объекта. И теперь метод 'to_s' делает то, что должен, с вставленным кодом. Еще раз спасибо! – theillien

0

Добавить условие и карту массива на @@ Person. код описан здесь:

class Person 
    attr_accessor :first_name, :last_name  
    @@people = [] 

    def initialize(first_name,last_name) 
    @first_name = first_name 
    @last_name = last_name 
    @@people.push(self) 
    end 

    def self.search(last_name) 
    @last_name = last_name #accept a `last_name` parameter 
    @people = @@people.select { |person| person.last_name == @last_name }.map{|p| p.first_name.to_s + ' ' + p.last_name.to_s} 

    #return a collection of matching instances 
    end 

    #have a `to_s` method to return a formatted string of the person's name 
    def to_s 
    #return a formatted string as `first_name(space)last_name` 
    end 
end 

p1 = Person.new("John", "Smith") 
p2 = Person.new("John", "Doe") 
p3 = Person.new("Jane", "Smith") 
p4 = Person.new("Cool", "Dude") 

puts Person.search("Smith") 
Смежные вопросы