Ruby 尝试初始化一组卡片时的nil类

Ruby 尝试初始化一组卡片时的nil类,ruby,Ruby,下面的代码导致nil,我不知道为什么。我的初始化有问题吗 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 initial

下面的代码导致nil,我不知道为什么。我的初始化有问题吗

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
类卡
数值=%w(2 3 4 5 6 7 8 9 10 J Q K A)
诉讼=%w(S H D C)
def初始化(套件、值)
@西装
@价值=价值
结束
结束
甲板
属性存取器:卡片
def初始化
@卡片=[]
卡片:套装。每个都适合|
卡片::值。每个都有值|

@卡片您创建一个新对象
Deck.new
,但不打印其
卡片的值
-您打印一个
@cards
实例变量,在此上下文中该变量为
nil


您可能需要类似于
p Deck.new.cards
的东西,您创建了一个新对象
Deck.new
,但您不打印其
卡的值
-您打印了一个
@cards
实例变量,在此上下文中该变量为
nil


您可能需要类似于
p Deck的东西。新的.cards

@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
类卡
数值=%w(2 3 4 5 6 7 8 9 10 J Q K A)
诉讼=%w(S H D C)
def初始化(套件、值)
@西装
@价值=价值
结束
结束
甲板
属性存取器:卡片
def初始化
@卡片=[]
卡片:套装。每个都适合|
卡片::值。每个都有值|

@卡
@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
类卡
数值=%w(2 3 4 5 6 7 8 9 10 J Q K A)
诉讼=%w(S H D C)
def初始化(套件、值)
@西装
@价值=价值
结束
结束
甲板
属性存取器:卡片
def初始化
@卡片=[]
卡片:套装。每个都适合|
卡片::值。每个都有值|
@卡片或只是:

my_deck = Deck.new

p my_deck.cards
或者只是:

my_deck = Deck.new

p my_deck.cards
简而言之,实例变量只能由同一类中的其他方法看到。我相信你想做的是:

new_deck = Deck.new
p new_deck.cards
new_deck
上调用
cards
方法将返回
@cards

简言之,实例变量只能由同一类中的其他方法看到。我相信你想做的是:

new_deck = Deck.new
p new_deck.cards

new_deck
上调用
cards
方法将返回
@cards

当前
@cards
数组的输出很难读取,并且包含对象信息。我想我会提供一个我刚刚想出的替代方案,希望它能有所帮助:

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

当前,
@卡
阵列的输出很难读取,并且包含对象信息。我想我会提供一个我刚刚想出的替代方案,希望它能有所帮助:

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

甲板类中是否“初始化”了一个输入错误?您的
@cards
数组中填充了实例变量。。。不太明智,所以我认为你需要重新考虑这一点。可能会尝试以一个数组结束,比如
@cards
=[[S,2],[S,3]…等等]。我想要这样一个目的。我希望每张卡片都是唯一的对象。卡片组类中是否“初始化”了打字错误?您的
@cards
数组中填充了实例变量。。。不太明智,所以我认为你需要重新考虑这一点。可能会尝试以一个数组结束,比如
@cards
=[[S,2],[S,3]…等等]。我想要这样一个目的。我希望每张卡片都是独一无二的。你说得对。在Card类中编辑to_s方法后,它就可以工作了。非常感谢。几分钟后我会选择你的答案。你是对的。在Card类中编辑to_s方法后,它就可以工作了。非常感谢。几分钟后我会选择你的答案。你是对的。对不起,我先看到了另一个答案。你说得对。很抱歉,我先看到了另一个答案。是的,我编辑了to_的方法,效果很好。谢谢你的选择。是的,我编辑了to_的方法,效果很好。谢谢你的选择。