代码之家  ›  专栏  ›  技术社区  ›  M.E.

朱莉娅身上有没有类似的定义?

  •  1
  • M.E.  · 技术社区  · 6 年前

    我正在实现一些基本的状态机,其中包括Julia中的几个状态。

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

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

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

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

    茱莉亚身上有没有与“定义”相当的东西?

    1 回复  |  直到 6 年前
        1
  •  8
  •   Cameron Bieganek    6 年前

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

    julia> @enum Heat LOW=1 MEDIUM=2 HIGH=3
    
    julia> Int.([LOW, MEDIUM, HIGH])
    3-element Array{Int64,1}:
     1
     2
     3
    

    请注意,在创建开关时,如 println 在上面的定义中,您可以确信 停止 开始 错误 是唯一可能的值 状态 对象这可以通过显式构造 状态 物体:

    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
    
        2
  •  6
  •   Jeffrey Sarnoff    6 年前

    如果你真的想要尽可能接近的东西 #define <Symbol> <Integer> const :

    const STOP  = 1
    const START = 2
    const ERROR = 3
    
    推荐文章