2017-04-19 9 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 पर मुख्य में आयात किया जाता है, दुभाषिया यह Simulation.jl की लाइन 4 में नहीं देख सकेंगे।

मैं MyModule.jl में कुछ भी आयात नहीं कर सकता, क्योंकि मुझे नहीं पता कि उपयोगकर्ता अपनी सामग्री का नाम कैसे देगा या उसे कितनी अतिरिक्त libs की आवश्यकता हो सकती है।

क्या मॉड्यूल के साथ ऐसा करने का कोई तरीका है? अन्यथा मैं मॉड्यूल का उपयोग नहीं करूँगा।

उत्तर

10

यहां उत्तर के भीतर AbstractType के कस्टम उपप्रकारों के लिए आवश्यक इंटरफ़ेस के रूप में कॉल करने के लिए सभी कार्यों के लिए स्टब्स बनाना है। यही कारण है कि है, 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 विधि जोड़ने की जरूरत बहुत! विशेष रूप से स्टब्स उपयोगकर्ता को सूचित करने में बहुत मदद करेंगे कि मेरे इंटरफेस के खिलाफ कोड कैसे करें। मैंने अपना स्टार्ट सिमुलेशन फ़ंक्शन नहीं बढ़ाया था। किसी भी कारण से आप इसे मॉड्यूल फ़ाइल में क्यों डालते हैं? – Nozdrum

+0

यह वास्तव में कोई फर्क नहीं पड़ता कि आप अपने मॉड्यूल को अलग फ़ाइलों में कैसे व्यवस्थित करते हैं। इस कोड को सीधे 'मॉड्यूल' ब्लॉक में, या तो सीधे या 'शामिल' के माध्यम से रहने की आवश्यकता है। –

संबंधित मुद्दे

 संबंधित मुद्दे