2017-04-19 6 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 L

Simulation.jl 및 MyModule.jl이 나와 SomeImplementation.jl 및 Main.jl에 의해 작성된
# push!(LOAD_PATH, pwd()) # for local usage 
using MyModule 
include("SomeImplementation.jl") 
startSimulation(ConcreteType(5)) 

은 사용자가 기록됩니다.

모듈에 자체 네임 스페이스가 있고 SomeImplementation.jl을 main 3 행으로 가져 오더라도 인터프리터는 Simulation.jl의 4 행에서 해당 이름 공간을 보지 못하기 때문에 위의 예제가 작동하지 않습니다.

MyModule.jl에서 아무 것도 가져올 수 없습니다. 사용자가 자신의 물건에 이름을 지정하는 방법이나 추가로 필요할 수도있는 libs를 알 수 없기 때문입니다.

모듈로이를 수행 할 방법이 있습니까? 그렇지 않으면 모듈을 사용하지 않을 것입니다.

답변

10

사용자 정의 하위 유형 AbstractType의 필수 인터페이스로 MyModule 내에서 호출 할 모든 함수에 대한 스텁을 만드는 방법입니다. 즉, MyModule 내에서, 당신은 것입니다 :

MyModule.doStuff(me::ConcreteType) 
    me.variable 
end 
+0

감사를 :

abstract AbstractType doStuff(::AbstractType) = error("custom AbstractType objects must define a 'doStuff' method) function startSimulation(unknown::AbstractType) doStuff(unknown) end 

그런 다음 구체적인 구현 그냥 특별히 가져 오기하거나 자격으로 인 MyModule에서 함수에 자신의 doStuff 방법을 추가 할 필요가 제비! 특히 스텁은 내 인터페이스에 대해 코드 작성하는 방법을 사용자에게 알리는 데 많은 도움이됩니다. 나는 startSimulation 함수를 움직이지 않았다. 모듈 파일에 넣은 이유는 무엇입니까? – Nozdrum

+0

모듈을 어떻게 분리 된 파일로 구성하는지는 중요하지 않습니다. 이 코드는 직접적으로 또는'include'를 통해'module' 블록 내에 존재해야합니다. –

관련 문제