Ruby (state_machine gem)如何在状态机中使用实例变量?
我试图通过将口香糖机作为状态机来实现一个讲座。目的是用0个硬币和10个口香糖球初始化它。默认情况下,它已准备就绪;你插入一枚硬币,然后从那里要求退款或转动曲柄。转动曲柄将使硬币计数器增加1,同时减少硬币计数器(并返回随机的口香糖颜色)。如果剩下0个口香糖球,转动曲柄什么也不做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
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/<代码>),它可以访问实例变量。
谢谢你,这解决了一切,我现在明白了很多。谢谢你,这解决了一切,我现在明白了好多了。