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