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