我正在使用Julia语言实现一些基本状态机,其中包含多个状态。
在C语言中,我可以使用以下类似的方式跟踪当前状态:
#define STOP 1
#define START 2
#define ERROR 3
然后在比较等操作中使用友好的常量。
if(state == STOP) {
printf("Stop state.\n");
}
Julia中是否有类似于C语言中的 #define 的东西?
我正在使用Julia语言实现一些基本状态机,其中包含多个状态。
在C语言中,我可以使用以下类似的方式跟踪当前状态:
#define STOP 1
#define START 2
#define ERROR 3
if(state == STOP) {
printf("Stop state.\n");
}
Julia中是否有类似于C语言中的 #define 的东西?
@enum
宏定义的:@enum State STOP START ERROR
STOP
,START
和ERROR
,它们都是State
类型。这意味着您可以在枚举类型上分派函数:import Base.println
function println(s::State)
if s == STOP
println("Stop state.")
elseif s == START
println("Start state.")
else
println("Error state.")
end
end
julia> s = STOP
julia> println(s)
Stop state.
枚举类型可以转换为整数值:
julia> Int.([STOP, START, ERROR])
3-element Array{Int64,1}:
0
1
2
0
开始。但是,在使用@enum
宏时,您可以选择显式设置枚举的整数值:julia> @enum Heat LOW=1 MEDIUM=2 HIGH=3
julia> Int.([LOW, MEDIUM, HIGH])
3-element Array{Int64,1}:
1
2
3
println
定义中,您可以确信STOP
、START
和ERROR
是State
对象的唯一可能值。这可以通过显式构造State
对象来证明:julia> State(0), State(1), State(2)
(STOP::State = 0, START::State = 1, ERROR::State = 2)
julia> State(3)
ERROR: ArgumentError: invalid value for Enum State: 3
Stacktrace:
[1] enum_argument_error(::Symbol, ::Int64) at ./Enums.jl:34
[2] State(::Int64) at ./Enums.jl:139
[3] top-level scope at none:0
#define <Symbol> <Integer>
尽可能接近的东西,那么请使用const
。const STOP = 1
const START = 2
const ERROR = 3
state
变量来说,使用枚举更有意义,即使问题没有明确要求。 - M.E.