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

标签 julia metaprogramming

我有一个模块,其中定义了一个枚举。

module myModule
  @enum  type A B B C D

end

type1 = myModule.A

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

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

但是我收到一条我不太明白的警告消息:

WARNING: replacing module myModule.

并且 type2 的类型也只是一个 Symbol

最佳答案

可能最简单的方法是使用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
)

关于julia - 如何在宏中将字符串转换为特定的枚举类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56808569/

相关文章:

parallel-processing - 如何在 Julia 中到处定义宏?

sorting - 在 julia 中对每个矩阵列进行排序

ruby - 如何使用 Ruby mixins 作为类的补丁

c++ - 在 C++ 元编程中是否全部使用模板?

c++ - g++ 模板实例化器有多智能(避免模板膨胀)

julia - 如何在 Julia 中求解随机微分方程?

plot - 如何在 Julia 中绘制矢量场?

julia - 如何从字典中删除键?

Ruby 元编程 : dynamically define methods based on database entries?

c++ - 错误 : template parameter redeclared here as 'false' . 一些模板魔法