2017-04-19 5 views
5

Grundsätzlich ich ein Modul möchten, die Funktionen, die außerhalb ihres Anwendungsbereichs nutzen können. Ich brauche das, weil meine Arbeit nur einen Rahmen bieten, wo der Benutzer seinen eigenen Code zu setzen in der Lage sein. So etwas wie diesWie können Sie verwenden Funktionen von außerhalb eines Moduls innerhalb eines Moduls

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 

und schließlich Main.j l

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

Wo Simulation.jl und MyModule.jl geschrieben werden von mir und SomeImplementation.jl und Main.jl werden vom Anwender geschrieben.

Jetzt funktioniert das obige Beispiel nicht, da Module ihren eigenen Namespace haben und selbst wenn SomeImplementation.jl in Zeile 3 importiert wird, wird der Interpreter sie nicht in Zeile 4 von Simulation.jl sehen.

Ich kann nichts in MyModule.jl importieren, weil ich nicht wissen kann, wie der Benutzer seine Sachen nennen wird oder was er zusätzliche Libs vielleicht sogar müssen.

Gibt es sind Möglichkeit, dies mit Modulen zu tun? Ansonsten werde ich einfach keine Module verwenden.

Antwort

10

Die Antwort hier ist, Stubs für alle Funktionen zu erstellen, die Sie innerhalb MyModule als eine erforderliche Schnittstelle für die benutzerdefinierten Subtypen von AbstractType aufrufen möchten. Das heißt, innerhalb MyModule, dann würden Sie haben:

abstract AbstractType 

doStuff(::AbstractType) = error("custom AbstractType objects must define a `doStuff` method) 

function startSimulation(unknown::AbstractType) 
    doStuff(unknown) 
end 

Dann werden die konkreten Implementierungen müssen nur speziell ihre doStuff Methode, um die Funktion in MyModule hinzufügen, indem Sie es importieren oder qualifizieren es:

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

vielen Dank! Menge! Vor allem die Stubs helfen sehr, den Benutzer darüber zu informieren, wie er mit meiner Schnittstelle arbeiten soll. Ich habe meine StartSimulation-Funktion nicht verschoben. Gibt es einen Grund, warum Sie es in die Moduldatei geschrieben haben? – Nozdrum

+0

Es spielt keine Rolle, wie Sie Ihr Modul in separate Dateien organisieren. Dieser Code muss nur innerhalb des 'module' Block leben, entweder direkt oder durch' include'. –

Verwandte Themen