ruby – 使用state_machine,如何从:if lambda中访问事件参数

我正在使用
state_machine gem来模拟纸牌游戏,我有一个转换条件,需要在绘制卡片时知道事件参数.这是一些示例代码.

class CardGame
  state_machine do
    before_transition :drawing_card => any, :do => :drawn_card
    event :draw_card
      transition :drawing_card => :end_of_round, :if => lambda {|game|
        # Check goes here, I require knowing which card was taken
        # which is passed as arguments to the event (:ace, :spaces)
      }
    end
  end

  def drawn_card(value, suit)
    # I can access the event arguments in the transition callbacks
  end
end

game = CardGame.new
game.draw_card(:ace, :spades)

我在想另一种方法是将对象的套装和值设置为变量,但它比使用事件的参数要麻烦得多.

提前致谢 :)

最佳答案 这里的主要问题是状态机可能不属于您的CardGame类.游戏状态位于别处.我可以看到四种主要的域模型:

>卡
>甲板
>手
>游戏

游戏将有一个或多个甲板(每个52卡)和一个或多个手. (你甚至可能想要一个Player类,玩家有一个Hand,你的通话).

举个例子,甲板可能会有一个洗牌!和交易方法.一只手将有一个游戏方法.这是规则逻辑可能存在的地方.

Game类主要包​​含一个循环,如下所示:

def run
  deal               
  do 
    play_hands       
    check_for_winner 
  while(playing)
end

当然,更详细的细节,但你可能会发现这种方法更清爽,更容易测试.

点赞