朱莉娅中有#define等效项吗?

时间:2019-09-20 23:44:12

标签: julia

我正在实现一些基本状态机,该状态机在Julia中具有多个状态。

在C语言中,我将使用类似于以下内容的方式跟踪当前状态:

#define STOP 1
#define START 2
#define ERROR 3

然后在比较等中使用友好常量。

if(state == STOP) {
    printf("Stop state.\n");
}

在Julia中是否有与#define等效的东西?

2 个答案:

答案 0 :(得分:7)

您可以使用enum。枚举是使用@enum宏定义的:

@enum State STOP START ERROR

这将创建三个常量STOPSTARTERROR,它们的类型均为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定义,您可以确信STOPSTARTERRORState对象。可以通过显式构造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