2017-04-19 102 views
5

基本上我想要一个可以使用超出范围的功能的模块。 我需要这个,因为我的工作将只提供一个框架,用户将能够把自己的代码他,像这样这样如何使用模块内部模块外部的功能

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.j升

# push!(LOAD_PATH, pwd()) # for local usage 
using MyModule 
include("SomeImplementation.jl") 
startSimulation(ConcreteType(5)) 

凡Simulation.jl和MyModule.jl都是由我和SomeImplementation.jl和Main.jl写入由用户编写。

现在上面的例子不起作用,因为模块有它们自己的命名空间,甚至SomeImplementation.jl在第3行的main中被导入,解释器将不会在Simulation.jl的第4行看到它。

我无法在MyModule.jl中导入任何东西,因为我无法知道用户如何命名他的东西或他甚至可能需要什么额外的库。

有没有办法做到这一点与模块?否则,我只是不使用模块。

回答

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 
+0

谢谢很多!尤其是存根将帮助很多人通知用户如何对我的界面进行编码。我没有移动我的startSimulation函数tho。你为什么把它放到模块文件中的任何原因? – Nozdrum

+0

如何将模块组织为单独的文件并不重要。这段代码只需要直接或者通过'include'就可以在'module'块中生存。 –