2016-02-08 22 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

是在甲板类“初始化”一个错字? – TopperH

+0

你的'@ cards'数组充满了实例变量......不是很明智,所以我认为你需要重新考虑这个。也许尝试最后得到像@ @ cards' = [[S,2],[S,3] ...等]的数组。 –

+0

我想要那样的目的。我希望每张卡都是一个独特的物体。 –

回答

0

您创建一个新的对象Deck.new,但你不要打印其cards的价值 - 你打印@cards实例变量,它在这方面是nil

你可能想要类似p Deck.new.cards

+0

你是对的。编辑Card类中的to_s方法后,它可以工作。谢谢。我会在几分钟内选择你的答案。 –

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方法,它工作正常。感谢替代寿。 –