我正在实现一些基本状态机,该状态机在Julia中具有多个状态。
在C语言中,我将使用类似于以下内容的方式跟踪当前状态:
#define STOP 1
#define START 2
#define ERROR 3
然后在比较等中使用友好常量。
if(state == STOP) {
printf("Stop state.\n");
}
在Julia中是否有与#define等效的东西?
答案 0 :(得分:7)
您可以使用enum。枚举是使用@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
答案 1 :(得分:5)
如果您确实想要尽可能接近sel <- df[-1]==4
df[-1] <- ""
df[-1][sel] <- names(df[-1])[col(df[-1])[sel]]
# id unknownvarname1 unknownvarname2
#1 1 unknownvarname2
#2 2
#3 3
#4 4 unknownvarname1
#5 5 unknownvarname2
#6 6
#7 7
#8 8 unknownvarname1
的东西,请使用#define <Symbol> <Integer>
:
const