Ruby (state_machine gem)如何在状态机中使用实例变量?

Ruby (state_machine gem)如何在状态机中使用实例变量?,ruby,state-machine,Ruby,State Machine,我试图通过将口香糖机作为状态机来实现一个讲座。目的是用0个硬币和10个口香糖球初始化它。默认情况下,它已准备就绪;你插入一枚硬币,然后从那里要求退款或转动曲柄。转动曲柄将使硬币计数器增加1,同时减少硬币计数器(并返回随机的口香糖颜色)。如果剩下0个口香糖球,转动曲柄什么也不做 class GumballMachine attr_reader :coins, :gumballs def initialize @coins = 0 @gumballs = 10 su

我试图通过将口香糖机作为状态机来实现一个讲座。目的是用0个硬币和10个口香糖球初始化它。默认情况下,它已准备就绪;你插入一枚硬币,然后从那里要求退款或转动曲柄。转动曲柄将使硬币计数器增加1,同时减少硬币计数器(并返回随机的口香糖颜色)。如果剩下0个口香糖球,转动曲柄什么也不做

class GumballMachine
  attr_reader :coins, :gumballs

  def initialize
    @coins = 0
    @gumballs = 10
    super
  end

  def dispense_gumball
    @coins += 1
    @gumballs -= 1
    [:red, :green, :blue, :purple, :pink].sample
  end

  state_machine :state, initial: :ready do
    event :insert_coin { transition :ready => :holding_coin }

    event :request_refund { transition :holding_coin => :ready }

    event :turn_crank do
      dispense_gumball if @gumballs > 0
      transition :holding_coin => :ready
    end
  end
end

但是,如果@gumballs>0,则在语句
上失败,因为那时还没有定义
@gumballs
。我已经反复阅读了文档并用谷歌搜索了它,但是我不知道这有什么问题,或者我应该做什么。

实例变量在状态机中是不可访问的,但是当您使用attr\u accessor时,您可以通过传递gumball machine对象来访问它

有一个转换前回拨来完成你的配药

before_transition holding_coin: :ready do |machine, transition|
  machine.dispense_gumball if machine.gumballs > 0
end

event :turn_crank do
  transition :holding_coin => :ready
end

实例变量在状态机中是不可访问的,但是当您将其设置为attr_accessor时,您可以通过传递gumball machine对象来访问它

有一个转换前回拨来完成你的配药

before_transition holding_coin: :ready do |machine, transition|
  machine.dispense_gumball if machine.gumballs > 0
end

event :turn_crank do
  transition :holding_coin => :ready
end

事件
块内的上下文与方法定义内的上下文不同。我猜在事件块中调用时,
self
指的是事件,而不是
GumballMachine

状态机
包括一个示例,说明了这一点:

event :crash do
  transition all - [:parked, :stalled] => :stalled, :if => lambda {|vehicle| !vehicle.passed_inspection?}
  end
end
在示例中,
vehicle
指的是实例,
passed\u inspection?
是实例上的一种方法


对于您的情况,您可以考虑添加一个方法(例如,代码> HasyGunBoovis/<代码>),该方法可以访问实例变量。

< P> <代码>事件块的上下文与方法定义中的上下文不相同。我猜在事件块中调用时,
self
指的是事件,而不是
GumballMachine

状态机
包括一个示例,说明了这一点:

event :crash do
  transition all - [:parked, :stalled] => :stalled, :if => lambda {|vehicle| !vehicle.passed_inspection?}
  end
end
在示例中,
vehicle
指的是实例,
passed\u inspection?
是实例上的一种方法


对于你的情况,你可以考虑添加一个方法(例如,代码> HasyGunBoovis/<代码>),它可以访问实例变量。

谢谢你,这解决了一切,我现在明白了很多。谢谢你,这解决了一切,我现在明白了好多了。