无状态库 - PermitIf 与 SetTriggerParameters 一起使用<T>
Stateless library - PermitIf usage with SetTriggerParameters<T>
如何将 PermitIf
与 SetTriggerParameters
一起使用?
在这个例子中,我正在模拟一个电机,它可以前进、后退或关闭(不移动)。前进和后退可以是double
的速度,所以我需要SetTriggerParameters<double>
。但是,将速度设置为 0 会关闭电机。
我希望禁止使用参数 0 触发 TurnOnForwards
或 TurnOnBackwards
- 我希望 TurnOff
触发器明确成为关闭电机的方式。否则,您会遇到当前状态为 Forwards/Backwards
但速度为 0.
的情况
这是我得到的错误:
CS1503 Argument 1: cannot convert from 'UserQuery.Triggers' to 'Stateless.StateMachine<UserQuery.State, UserQuery.Triggers>.TriggerWithParameters'
public enum State
{
Off,
Forwards,
Backwards
}
public enum Triggers
{
TurnOff,
TurnOnForwards,
TurnOnBackwards,
}
var machine = new StateMachine<State, Triggers>(State.Off);
var forwardsTrigger = machine.SetTriggerParameters<double>(Triggers.TurnOnForwards);
var backwardsTrigger = machine.SetTriggerParameters<double>(Triggers.TurnOnBackwards);
machine.Configure(State.Off)
.PermitIf<double>(Triggers.TurnOnForwards, State.Forwards, (speed) => speed > 0) // error
.PermitIf<double>(Triggers.TurnOnBackwards, State.Forwards, (speed) => speed < 0) // error
.Permit(Triggers.TurnOnForwards, State.Forwards)
.Permit(Triggers.TurnOnBackwards, State.Backwards);
machine.Configure(State.Forwards)
.Permit(Triggers.TurnOnBackwards, State.Backwards)
.Permit(Triggers.TurnOff, State.Off);
machine.Configure(State.Backwards)
.Permit(Triggers.TurnOnForwards, State.Forwards)
.Permit(Triggers.TurnOff, State.Off);
machine.Fire(Triggers.TurnOnForwards);
machine.Fire(Triggers.TurnOff);
machine.Fire(Triggers.TurnOnBackwards);
machine.Fire(Triggers.TurnOff);
这可能吗?
你现在可能已经弄明白了,但如果你使用参数化触发器,它将编译:
machine.Configure(State.Off)
.PermitIf(forwardsTrigger, State.Forwards, (speed) => speed > 0) // no error
.PermitIf(backwardsTrigger, State.Forwards, (speed) => speed < 0) // no error
.Permit(Triggers.TurnOnForwards, State.Forwards)
.Permit(Triggers.TurnOnBackwards, State.Backwards);
如何将 PermitIf
与 SetTriggerParameters
一起使用?
在这个例子中,我正在模拟一个电机,它可以前进、后退或关闭(不移动)。前进和后退可以是double
的速度,所以我需要SetTriggerParameters<double>
。但是,将速度设置为 0 会关闭电机。
我希望禁止使用参数 0 触发 TurnOnForwards
或 TurnOnBackwards
- 我希望 TurnOff
触发器明确成为关闭电机的方式。否则,您会遇到当前状态为 Forwards/Backwards
但速度为 0.
这是我得到的错误:
CS1503 Argument 1: cannot convert from 'UserQuery.Triggers' to 'Stateless.StateMachine<UserQuery.State, UserQuery.Triggers>.TriggerWithParameters'
public enum State
{
Off,
Forwards,
Backwards
}
public enum Triggers
{
TurnOff,
TurnOnForwards,
TurnOnBackwards,
}
var machine = new StateMachine<State, Triggers>(State.Off);
var forwardsTrigger = machine.SetTriggerParameters<double>(Triggers.TurnOnForwards);
var backwardsTrigger = machine.SetTriggerParameters<double>(Triggers.TurnOnBackwards);
machine.Configure(State.Off)
.PermitIf<double>(Triggers.TurnOnForwards, State.Forwards, (speed) => speed > 0) // error
.PermitIf<double>(Triggers.TurnOnBackwards, State.Forwards, (speed) => speed < 0) // error
.Permit(Triggers.TurnOnForwards, State.Forwards)
.Permit(Triggers.TurnOnBackwards, State.Backwards);
machine.Configure(State.Forwards)
.Permit(Triggers.TurnOnBackwards, State.Backwards)
.Permit(Triggers.TurnOff, State.Off);
machine.Configure(State.Backwards)
.Permit(Triggers.TurnOnForwards, State.Forwards)
.Permit(Triggers.TurnOff, State.Off);
machine.Fire(Triggers.TurnOnForwards);
machine.Fire(Triggers.TurnOff);
machine.Fire(Triggers.TurnOnBackwards);
machine.Fire(Triggers.TurnOff);
这可能吗?
你现在可能已经弄明白了,但如果你使用参数化触发器,它将编译:
machine.Configure(State.Off)
.PermitIf(forwardsTrigger, State.Forwards, (speed) => speed > 0) // no error
.PermitIf(backwardsTrigger, State.Forwards, (speed) => speed < 0) // no error
.Permit(Triggers.TurnOnForwards, State.Forwards)
.Permit(Triggers.TurnOnBackwards, State.Backwards);