Julia中是否有与#define等效的命令?

3

我正在使用Julia语言实现一些基本状态机,其中包含多个状态。

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

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

然后在比较等操作中使用友好的常量。
if(state == STOP) {
    printf("Stop state.\n");
}

Julia中是否有类似于C语言中的 #define 的东西?


2
听起来你需要一个枚举。 - Carcigenicate
2个回答

8
你可以使用枚举。枚举是使用@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

6
如果您真的希望得到与 #define <Symbol> <Integer> 尽可能接近的东西,那么请使用const
const STOP  = 1
const START = 2
const ERROR = 3

2
谢谢,我想对于特定的 state 变量来说,使用枚举更有意义,即使问题没有明确要求。 - M.E.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接