2016-04-01 4 views
0

Я пытаюсь создать класс ruby ​​для игры под названием times up. По сути, для начала необходимо выполнить следующие функции:Элементы массива refresh/rollback класса Ruby

  • Каждый экземпляр класса - это игра.

  • В каждой игре есть набор слов, которые вводят игроки.

  • класс должен позволить получить случайный элемент из массива слов и впоследствии удалить этот элемент из игры.

  • Когда все слова вышли из «шляпы», игра должна быть способна обновить массив до его исходного содержимого, имитируя перевод слов обратно в шляпу для следующего раунда.

Именно этот последний момент, что у меня возникли проблемы с .. Я пытался создать фиктивный массив или базовый массив, который не модифицируется, а затем просто установить опустели массив в базовой массив в конце раунд, но это только приводит к тому, что я удаляю элементы из базового массива во втором раунде и оставляю два пустых массива в конце второго раунда: (как мне создать копию, которая не будет изменена?

Вот мой код:

class TimesUp 

    def initialize 
    @hat = [] 
    @basehat = [] 
    end 

    def NewWord(word) 
    @hat.push(word) 
    @basehat.push(word) 
    end 

    def grab 
    if @hat.empty? 
     puts "End of round!" 
    else 
     l = @hat.length 
     word = rand(l) 
     puts @hat[word] 
     @hat.delete_at(word) 
    end 
    end 

    def printout 
    puts @hat 
    end 

    # here is where i try to set the game array to the 'base' array. 
    def refresh 
    @hat = @basehat 
    @basehat = @basehat 
    end 
end 
+0

Вы явно устанавливаете две ссылки на один и тот же объект. Вам, вероятно, нужно обмануть или просто воссоздать его из списка слов. –

+0

Попробуйте что-нибудь вроде 'loop do; @hat = basehat.dup; <игра в игру>; <разрыв, когда надоело играть>; end'. –

ответ

0

Использование Object#dup и clone также может быть вариантом.

def refresh 
    @hat = @basehat.dup 
    @basehat = @basehat.dup 
end 
+0

Замечательно, что это сработало спасибо! Я все еще не понимаю, почему мой метод не работает, хотя я думал, что когда я установлю свою «шляпу» на «basehat», моя переменная «hat» просто примет значения, связанные с массивом «basehat». Однако, игра в игру далее показывает, что элементы также удаляются из «basehat». Почему это? Я полагаю, что это означает, что это не то же самое, что и копирование? – Kingdavidek

+0

вы просто назначили basehat в шляпу, оба были такими же, что удаление из шляпы равно удалению из basehat. dup/clone создает новые массивы и фактически копирует содержимое. caveat: если у вас есть сложные объекты в вашем basehat и измените их состояние в шляпе (скажем, назовите какой-то метод на них), их состояние также изменится в basehat. в этом случае вам придется написать метод глубокого клонирования. –

Смежные вопросы