2016-02-08 4 views
0

Следующий код приводит к нулю, и я не могу понять, почему. Что-то не так с моей инициализацией?Нулевой класс при попытке инициализации колоды карт

class Card 
    VALUES = %w(2 3 4 5 6 7 8 9 10 J Q K A) 
    SUITS = %w(S H D C) 

    def initialize(suit, value) 
     @suit = suit 
     @value = value 
    end 
end 

class Deck 
    attr_accessor :cards 

    def initialize 
     @cards = [] 
     Card::SUITS.each do |suit| 
      Card::VALUES.each do |value| 
       @cards << Card.new(suit, value) 
      end 
     end 
    end 
end 

Deck.new 

p @cards 
+0

ли в классе Deck «инициализирует» опечатка? – TopperH

+0

Ваш массив '@ cards' заполнен переменными экземпляра ... не рекомендуется, поэтому я думаю, вам нужно переосмыслить это. Возможно, попробуйте закончить таким массивом, как '@ cards' = [[S, 2], [S, 3] ... и т. Д.]. –

+0

Я хочу, чтобы это была одна цель. Я хочу, чтобы каждая карта была уникальным объектом. –

ответ

0

Вы создаете новый объект Deck.new, но не напечатает значение его cards - печатать переменную @cards экземпляра, который в этом контексте является nil.

Возможно, вы хотели что-то вроде p Deck.new.cards.

+0

Вы правы. После редактирования метода to_s в классе Card он работает. Спасибо. Я выберу ваш ответ через пару минут. –

1

@cards не известен за пределами объекта. Вне класса Deck это переменная экземпляра области верхнего уровня в Ruby.

Вы должны использовать метод доступа, чтобы получить содержание:

class Card 
    VALUES = %w(2 3 4 5 6 7 8 9 10 J Q K A) 
    SUITS = %w(S H D C) 

    def initialize(suit, value) 
     @suit = suit 
     @value = value 
    end 
end 

class Deck 
    attr_accessor :cards 

    def initialize 
     @cards = [] 
     Card::SUITS.each do |suit| 
      Card::VALUES.each do |value| 
       @cards << Card.new(suit, value) 
      end 
     end 
    end 
end 

deck = Deck.new #<--- Store object in a variable 

p deck.cards #<--- Use accessor 
1

или просто:

my_deck = Deck.new 

p my_deck.cards 
+0

Вы правы. Извините, но сначала я увидел другой ответ. –

1

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

new_deck = Deck.new 
p new_deck.cards 

Вызов метода cards на new_deck возвращается @cards.

0

В настоящее время ваш выход для массива @cards трудно прочитать и содержит информацию о объекте. Я думал, что предложить альтернативу я просто conjoured вверх, надеюсь, что это помогает:

class Deck 

    attr_writer :suits, :values 
    attr_accessor :deck 

    def initialize 
    suits 
    values 
    generate_deck 
    shuffle 
    end 

    def generate_deck 
    @deck = [] 
    @suits.each do |suit| 
     @values.each { |value| @deck << [suit, value] } 
    end 
    end 

    def suits 
    @suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades' ] 
    end 

    def values 
    @values = ('2'..'10').to_a + ['J','Q','K','A'] 
    end 

    #just in case you want to shuffle your deck 
    def shuffle 
    @deck.shuffle! 
    end 

end 

require 'pp' #this makes the output prettier 
new_deck = Deck.new 
pp new_deck.deck #calls your current deck so you can see it 

Выходной пример:

$ ruby yourfilename.rb 
[["Hearts", "K"], 
["Spades", "5"], 
["Clubs", "7"], 

#code omitted... (the rest of your cards would be here) 

["Clubs", "K"], 
["Hearts", "5"], 
["Diamonds", "J"], 
["Hearts", "7"]] 
+0

Да, я отредактировал метод to_s, и он отлично работает. Спасибо за альтернативу. –

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