Как превратить строку в конкретный тип перечисления в макросе? - PullRequest
2 голосов
/ 28 июня 2019

У меня есть модуль с определенным в нем перечислением.

module myModule
  @enum  type A B B C D

end

type1 = myModule.A

Теперь я хочу объявить экземпляр этого типа перечисления, но у меня есть только строка, указывающая, какой это тип. Я попробовал следующее:

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

Но я получаю предупреждающее сообщение, которое не совсем понимаю:

ВНИМАНИЕ: замена модуля myModule.

и тип type2 также просто Symbol.

1 Ответ

1 голос
/ 28 июня 2019

Вероятно, самый простой способ - использовать 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
)
...