Метод массива, который выводит только имя без экземпляров - PullRequest
0 голосов
/ 12 апреля 2020

Когда я запускаю команду, я получаю все названия песен, а затем экземпляры, следующие за ней. Как я могу получить только имена?

class Song 
    @@all = [] 
    attr_accessor :name 

    def initialize(name)
        @name = name
        @@all << self    
    end 

    def self.all
        @@all  
    end

    def self.print_all_song_names
        @@all.each do |song|
        puts song.name 
        end  
    end 
end 


hotline_bling = Song.new("Hotline Bling")
thriller = Song.new("Thriller")

ninety_nine_problems = Song.new("99 Problems")
thriller = Song.new("Thriller")


puts Song.print_all_song_names 

Какие выходы:

Hotline Bling
Thriller
99 Problems
Thriller
#<Song:0x00000000058ced30>
#<Song:0x00000000058cecb8>
#<Song:0x00000000058cebc8>
#<Song:0x00000000058ceb50> 

1 Ответ

0 голосов
/ 12 апреля 2020

Проблема с вашим кодом заключается в том, что вы звоните puts здесь и там.

Код уже вызывает puts в print_all_song_names, и после того, как вы позвоните puts Song.print_all_song_names, что примерно означает вызов метода и выводят возвращенное значение.

each возвращает получателя, что означает print_all_song_names возвращает значение переменной класса @@all. Который печатается снова.

Чтобы исправить это, просто не вызывайте puts в последней строке; Song.print_all_song_names уже распечатывает все необходимое.

Song.print_all_song_names # voilà
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...