如何在Ruby类之间传递变量?

Ale*_*ekx 6 ruby variables

我正在创建一个包含多个班级的纸牌游戏.目前,我使用全局变量来保存$shuffled_deck,$players_hand$dealers_hand变数,但我使用全局变量时(也许,不必要的),并希望使用实例变量担心.

我一直在看书,但没有什么是真的点击.任何人都可以帮我指出正确的方向吗?

使用实例变量我无法保存@players_hand@dealers_hand能够在其他类中使用它们.例如,我@players_hand来自Player班级.我有Dealer班级画一张卡片,但是我不能把它拉@players_handDealer班里把两者加在一起.

我目前的代码是:

class Blackjack

  def initialize
    @player = Player.new
    @dealer = Dealer.new
  end
end

class Dealer

  def initialize
    @deck = Deck.new
    $dealers_hand = 0
  end

  def hit_dealer
    @deck.hit_dealer
  end

  def hit_player
    @deck.hit_player
  end

  def draw_card
    @hit = $shuffled_deck
  end

  def shuffle
    @deck.suits
  end
end

class Player

  def initialize
    $players_hand = 0
  end   
end

class Deck

 def suits
   #code that shuffled the deck..
   $shuffled_deck = @shuffled_deck
 end

 def hit_player
   @hit = $shuffled_deck.pop
 end

 def hit_dealer
   @hit = $shuffled_deck.pop
 end

end
Run Code Online (Sandbox Code Playgroud)

Chu*_*uck 5

您想使用attr_readerattr_writer、 或attr_accessor。它们的工作原理如下:

  • attr_reader :players_hand:允许您编写以获取该玩家实例变量some_player.players_hand的值players_hand
  • attr_writer :players_hand:允许您写入some_player.players_hand = 0将变量设置为 0
  • attr_accessor :players_hand:允许您读取和写入,就好像您同时使用了attr_reader和 一样attr_writer

顺便说一下,这些所做的只是为您编写方法。如果你愿意,你可以像这样手动完成:

class Player
  def initialize
    @players_hand = 0
  end  

  def players_hand
    @players_hand
  end

  def players_hand=(new_value)
    @players_hand = new_value
  end
end
Run Code Online (Sandbox Code Playgroud)


pet*_*ter 5

使用你的例子,你可以这样做

class Blackjack
  attr_reader :player, :dealer

  def initialize
    @player = Player.new
    @dealer = Dealer.new
  end
end

class Dealer
  def dealers_hand #the long java way of a getter
    @dealers_hand
  end

  #and now the short ruby way
  attr_reader :dealers_hand #if you only need to read the attribute
  attr_writer :dealers_hand #if you only need to write the attribute
  attr_accessor: dealers_hand #if you need both

  def initialize
    @deck = Deck.new
    @dealers_hand = 5
  end

  def hit_dealer
    @deck.hit_dealer
  end

  def hit_player
    @deck.hit_player
  end

  def draw_card
    @hit = $shuffled_deck
  end

  def shuffle
    @deck.suits
  end
end

class Player
  attr_reader :players_hand
  def initialize
    @players_hand = 0
  end   
end

class Deck

 def suits
   attr_reader :shuffled_deck
   @shuffled_deck = @shuffled_deck
 end

 def hit_player
   @hit = $shuffled_deck.pop
 end

 def hit_dealer
   @hit = $shuffled_deck.pop
 end

end

game = Blackjack.new
p game.dealer.dealers_hand
game.dealer.dealers_hand = 4
p game.dealer.dealers_hand
Run Code Online (Sandbox Code Playgroud)