2016-01-03 8 views
6

मान लें कि मेरे पास दो मॉड्यूल a.erl और b.erl हैं। दोनों मॉड्यूल में एक ही कार्य होते हैं (जावा में मैं कहूंगा "दोनों वर्ग एक ही इंटरफ़ेस को लागू करते हैं")। मॉड्यूल "c.erl" में मैं एक समारोह है कि मॉड्यूल वापस आ जाएगी "एक" या "b" (पैरामीटर पर निर्भर करता है)एरलांग में गतिशील रूप से मॉड्यूल को कैसे कॉल करें?

यहाँ है कि मैं क्या मॉड्यूल में रखना चाहते हैं करना चाहते हैं c.erl

-module(c) 

get_handler(Id) -> 

% if Id == "a" return a 

% if Id == "b" return b 

test() -> 

get_handler("a"):some_function1("here were go for a"), 

get_handler("a"):some_function2("aaaa"), 

get_handler("b"):some_function1("here we go for b") 

मैं यह काम कैसे कर सकता हूं? मैं एरलांग के लिए अपेक्षाकृत नया हूं और यह नहीं जानता कि इसे कैसे किया जाए। जावा में यह बहुत स्पष्ट होगा, क्योंकि आप कक्षा के नए उदाहरण को वापस कर देते हैं।

+0

मुझे यकीन नहीं है कि क्या मैं इस प्रश्न को लिखे गए तरीके से समझता हूं। क्या आप इस तरह आयात नहीं करेंगे: -इम्पोर्ट (मॉड्यूल, [फंक्शन 1/एरीटी, ..., फंक्शन एन/एरीटी])। 'और फिर' a: some_function/arity' या 'b: some_function/arity'' पर कॉल करें? –

+0

मैं मॉड्यूल "सी" या "अगर" कथन में अलग-अलग कॉल नहीं करना चाहता हूं। मैं वही कोड रखना चाहता हूं जो फ़ंक्शन कॉल करेगा, निर्भर करता है कि get_handler क्या देता है।मेरे उदाहरण में get_handler "ए" और "बी" के बीच चुनता है, लेकिन वहां से अधिक मॉड्यूल हो सकते हैं जो इसे चुन सकते हैं। – cactus

उत्तर

7

बस get_handler/1 वापसी एक परमाणु के रूप में मॉड्यूल का नाम है, और फिर इसका इस्तेमाल वांछित समारोह कॉल करने के लिए:

(get_handler("a")):some_function2("aaaa"), 
(get_handler("b")):some_function1("here we go for b"). 

ध्यान दें कि आप इस मामले में get_handler/1 करने के लिए कॉल के आसपास कोष्ठक की जरूरत है।

मॉड्यूल a और b के लिए get_handler/1 का एक सरल संस्करण हो सकता है:

get_handler("a") -> a; 
get_handler("b") -> b. 
+0

उत्तर के लिए बहुत बहुत धन्यवाद। यह वही है जो मुझे चाहिए। मेरा मुद्दा हल हो गया है। – cactus

5

आप एक चर में एक परमाणु है, तो आप एक मॉड्यूल का नाम के रूप में उपयोग कर सकते हैं।

तो, अगर आप इस तरह c:get_handler/1 निर्धारित कर सकते हैं:

get_handler("a") -> a; 
get_handler("b") -> b. 

आपका c:test/0 ठीक लग रहा है, को छोड़कर आप अतिरिक्त कोष्ठक की जरूरत है, इस तरह:

test() -> 
    (get_handler("a")):some_function1("here were go for a"), 
    (get_handler("a")):some_function2("aaaa"), 
    (get_handler("b")):some_function1("here we go for b"). 
फिर मॉड्यूल a में

और b सिर्फ एक को परिभाषित some_function1/1 और some_function/2, उदाहरण के लिए:

some_function1(Str) -> 
    io:format("module ~s function some_function1 string ~s~n", [?MODULE, Str]). 

some_function2(Str) -> 
    io:format("module ~s function some_function2 string ~s~n", [?MODULE, Str]). 

संपादित करें:

-behaviour(some_behaviour). 

: आप संभवतः यह भी एक व्यवहार आप BTW बात की इस तरह करने के लिए जा रहे हैं जो मतलब यह होगा कि मॉड्यूल a में घोषित करने और b कुछ इस तरह होगा परिभाषित करना चाहिए,

-module(some_behaviour). 
-callback some_function1 (String :: string()) -> ok . 
-callback some_function2 (String :: string()) -> ok . 

यह a और b की तरह किसी भी मॉड्यूल घोषणा करते हैं कि है कि वे व्यवहार का समर्थन का मतलब: तो फिर मॉड्यूल some_behaviour कुछ इस प्रकार बना some_behaviour उन कार्यों को परिभाषित करना होगा, और अगर वे नहीं करते हैं तो संकलक बोलेंगे। पैरामीटर और रिटर्न वैल्यू के प्रकार यहां स्थिर विश्लेषण आदि के लिए भी परिभाषित किए गए हैं।

+0

उत्तर के लिए बहुत बहुत धन्यवाद। यह वही है जो मुझे चाहिए। मेरा मुद्दा हल हो गया है। – cactus

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