2017-04-19 18 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リットル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行目にインポートされても、Simulator.jlの4行目にインタープリタが表示されないため、上の例は機能しません。

私はMyModule.jlに何もインポートできません。ユーザが自分のものに名前を付ける方法や、必要な場合がある余分なライブラリがわからないからです。

モジュールでこれを行う方法はありますか?それ以外の場合は、モジュールを使用しません。

答えて

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

モジュールをどのようにして別々のファイルに編成するかは実際問題ではありません。このコードは 'module'ブロックの中に直接または' include'を通して生きる必要があります。 –

関連する問題