Module 为模块中的每个子类型生成方法

Module 为模块中的每个子类型生成方法,module,julia,metaprogramming,Module,Julia,Metaprogramming,(由朱莉娅·斯莱克转载,供后人参考) 假设我有一些常数,比如 const FooConst = 1 const BarConst = 2 我也有一些结构 struct Foo end struct Bar end 现在我想为每个结构定义一个方法来查找这个常量 f(::Type{Foo}) = FooConst f(::Type{Bar}) = BarConst 如何使用元编程实现最后一个块?我基本上是想把Const添加到结构名称的末尾,并在代码中查找它 …(这)在模块外部工作,但在我的模

(由朱莉娅·斯莱克转载,供后人参考)

假设我有一些常数,比如

const FooConst = 1
const BarConst = 2
我也有一些结构

struct Foo end
struct Bar end
现在我想为每个结构定义一个方法来查找这个常量

f(::Type{Foo}) = FooConst
f(::Type{Bar}) = BarConst
如何使用元编程实现最后一个块?我基本上是想把
Const
添加到结构名称的末尾,并在代码中查找它

…(这)在模块外部工作,但在我的模块中,常量不会导出。导入模块后,f无法查找常量。我在这里:

module M
import InteractiveUtils: subtypes
export Foo, Bar, f

abstract type Super end
struct Foo <: Super end
struct Bar <: Super end

const FooConst = 1
const BarConst = 2

for T in subtypes(Super)
    @eval f(::Type{$T}) = $(Symbol(T, "Const"))
end

end # module
但是,我可以直接访问它:

julia> Main.M.FooConst
1

来自Julia slack上的Mason Protter:

梅森·普罗特下午2:26 @Sebastian Rollen问题在于
符号(T,“const”)
。这实际上最终扩展到了
Symbol(“Main.Foo.foocont”)
Symbol(“Main.Foo.BarConst”)
,而不是
Symbol(“foocont”)
Symbol(“BarConst”)
。您可以使用
符号(nameof(T),“Const”)
修复此问题,如下所示:

module M
import InteractiveUtils: subtypes
export Foo, Bar, f

abstract type Super end
struct Foo <: Super end
struct Bar <: Super end

const FooConst = 1
const BarConst = 2

for T in subtypes(Super)
    @eval f(::Type{$T}) = $(Symbol(nameof(T), "Const"))
end

end # module

julia> using .M;  f(Foo)
1

julia> f(Bar)
2
模块M
导入交互对象:子类型
出口Foo、Bar、f
抽象类型超级端
结构Foo f(Bar)
2.
确保在运行此代码之前重新启动Julia,否则Julia将继续使用从旧版本模块导出的函数

module M
import InteractiveUtils: subtypes
export Foo, Bar, f

abstract type Super end
struct Foo <: Super end
struct Bar <: Super end

const FooConst = 1
const BarConst = 2

for T in subtypes(Super)
    @eval f(::Type{$T}) = $(Symbol(nameof(T), "Const"))
end

end # module

julia> using .M;  f(Foo)
1

julia> f(Bar)
2