如何将字符串转换为宏中的特定枚举类型?

时间:2019-06-28 14:15:34

标签: julia metaprogramming

我有一个定义了枚举的模块。

module myModule
  @enum  type A B B C D

end

type1 = myModule.A

现在,我想声明此枚举类型的实例,但只有一个字符串指定它是哪种类型。我尝试了以下方法:

str = "B"
type2 = eval(:(myModule.Symbol($str)))

但是我收到一条我不太理解的警告消息:

  

警告:更换模块myModule。

type2的类型也只是Symbol

1 个答案:

答案 0 :(得分:1)

可能最简单的方法是使用getproperty

julia> module myModule
           @enum type A B C D
       end
Main.myModule

julia> str = "B";

julia> getproperty(myModule, Symbol(str))
B::type = 1

或者,您可以将表达式创建为字符串,然后解析并求值:

julia> eval(Meta.parse(string("myModule.", str)))
B::type = 1

或者,还是一样,只是使用字符串插值而不是使用string函数:

julia> eval(Meta.parse("myModule.$str"))
B::type = 1

请注意,语法myModule.Symbol(str)不等同于myModule.B。看起来该语法实际上只是在全局范围内调用Symbol(str)。例如,尝试以下操作:

julia> myModule.length([1, 2, 3])
3

julia> @code_lowered myModule.length([1, 2, 3])
CodeInfo(
1 ─ %1 = (Base.arraylen)(a)
└──      return %1
)