加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 07:09:40 所属栏目:百科 来源:网络整理
导读:我正在使用 state_machine gem来模拟纸牌游戏,我有一个转换条件,需要在绘制卡片时知道事件参数.这是一些示例代码. class CardGame state_machine do before_transition :drawing_card = any,:do = :drawn_card event :draw_card transition :drawing_card =
我正在使用 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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读