基本上我想要一个可以使用超出其范围的函数的模块。 我需要这个,因为我的工作只会提供一个框架,用户可以在其中放入自己的代码。像这样的东西
Simulation.jl
abstract AbstractType
function startSimulation(unknown::AbstractType)
doStuff(unknown)
end
MyModule.jl
module MyModule
include("Simulation.jl")
export AbstractType, startSimulation
end
SomeImplementation.jl
type ConcreteType <: AbstractType
variable::Int64
end
doStuff(me::ConcreteType)
me.variable
end
最后是Main.jl
# push!(LOAD_PATH, pwd()) # for local usage
using MyModule
include("SomeImplementation.jl")
startSimulation(ConcreteType(5))
我编写了Simulation.jl和MyModule.jl,SomeImplementation.jl和Main.jl由用户编写。
现在上面的示例不起作用,因为模块有自己的命名空间,甚至在第3行的main中导入SomeImplementation.jl,解释器也不会在Simulation.jl的第4行中看到它。
我无法在MyModule.jl中导入任何内容,因为我无法知道用户将如何命名他的内容或者他甚至可能需要哪些额外的库。
有没有办法用模块做到这一点?否则我就不会使用模块了。
答案 0 :(得分:10)
这里的答案是为MyModule
中要调用的所有函数创建存根,作为AbstractType
的自定义子类型的必需接口。也就是说,在MyModule
内,您将拥有:
abstract AbstractType
doStuff(::AbstractType) = error("custom AbstractType objects must define a `doStuff` method)
function startSimulation(unknown::AbstractType)
doStuff(unknown)
end
然后具体实现只需要通过导入或限定它来将他们的doStuff
方法专门添加到MyModule中的函数:
MyModule.doStuff(me::ConcreteType)
me.variable
end