如何使用模块内部模块外部的功能

时间:2017-04-19 18:24:02

标签: julia

基本上我想要一个可以使用超出其范围的函数的模块。 我需要这个,因为我的工作只会提供一个框架,用户可以在其中放入自己的代码。像这样的东西

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中导入任何内容,因为我无法知道用户将如何命名他的内容或者他甚至可能需要哪些额外的库。

有没有办法用模块做到这一点?否则我就不会使用模块了。

1 个答案:

答案 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