如何在Ruby中引用对象的“所有者”?

时间:2017-09-17 22:03:26

标签: ruby object inheritance attributes hierarchy

“所有者”可能不是正确的术语,但我不知道是什么让搜索变得非常困难。

我正在进行纸牌游戏,每个玩家都可以拥有多手牌。

我有一个“玩家”,“手”和“卡”类。

player1 = Player.new 
hand1 = Hand.new # => A new hand of two random cards

player1.hands.push(hand1)

#Now player1 has one hand with two cards in it.

我可以在hand1上调用一个属性或方法来引用它的“所有者”,播放器1吗?

我期待像

这样的东西
hand1.owner

=> #<Player:0x007fb6ae05b448
# @behavior=:human,
# @hands=[#<Hand:0x007fb6ad8653b0 @cards=[{:A,:spades},{:Q,:hearts}]>],
# @money=800,
# @name="Dougie Jones">

2 个答案:

答案 0 :(得分:1)

不,没有办法。一个物体不知道你保留它的位置。您可以将它保存在许多不同的地方,那么谁将成为所有者?您需要手动设置关系或考虑更改设计。

考虑一下:

class Player
  attr_accessor :hands

  def initialize
    @hands = []
  end

  def add_hand(hand)
    hand.player = self
    @hands << hand
  end
end

class Hand
  attr_accessor :player
end

player = Player.new
hand = Hand.new
player.add_hand(hand)
puts hand.player #=> #<Player:0x000000017b2978>

答案 1 :(得分:1)

您可以使用属性交叉引用对象。 (每个Hand对象都可以引用特定的Player对象)

例如,您可以向Hand模型添加属性:

class Hand
  attr_accessor :player
end

然后,当您创建新的Hand时,您可以设置player

player1 = Player.new
hand1 = Hand.new
hand1.player = player1

这基本上是ActiveRecord associations的工作方式。