2016-01-03 9 views
6

私は2つのモジュールを持っているとします。a.erlb.erlとします。両方のモジュールには同じ機能があります(Javaでは "両方のクラスが同じインターフェースを実装しています")。ここではモジュールで 「c.erl」私はモジュールを返す関数を持つようにしたい「」または「B」(パラメータに依存します)Erlangでモジュールを動的に呼び出す方法は?

は、私はモジュール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") 

どうすればこの作品を作成できますか?私はErlangには比較的新しいので、それをどうやって行うのか分からない。 Javaでは、クラスの新しいインスタンスを返すだけなので、非常に明白です。

+0

書かれている方法でこの質問を理解できるかどうかはわかりません。 -import(Module、[Function1/Arity、...、FunctionN/Arity])。 'をインポートして、 'a:some_function/arity'または' b:some_function/arity'を呼び出すだけですか? –

+0

私はモジュール "c"または "if"ステートメントで異なる呼び出しをしたくありません。私は関数を呼び出す同じコードを、get_handlerが返す関数に依存させたいと思っています。私の例では、get_handlerは "a"と "b"の間を選択しますが、そこから選択できるモジュールはもっと多いかもしれません。 – cactus

答えて

7

ただ、原子などのモジュール名を返すget_handler/1持って、その後、所望の機能を呼び出すためにそれを使用する:あなたはこのケースでget_handler/1への呼び出しを括弧で囲む必要

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

注意を。

モジュールabためget_handler/1の簡易版は次のようになります。あなたは、変数中の原子を持っている場合は

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

ありがとうございました。それはまさに私が必要なものです。私の問題は解決されました。 – cactus

5

は、モジュール名として使用することができます。

だから、あなたはこのようにc:get_handler/1を定義することができます。

モジュール aで次に
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"). 

bがちょうど定義:あなたはこのように、余分な括弧を必要とする以外

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

あなたc:test/0が、OKに見えます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]). 

編集:あなたがところでこの種のものをやろうとしている場合は、おそらくも、あなたがモジュールabにこのような何か宣言します意味しており、動作を定義する必要があります

-behaviour(some_behaviour). 

をこれは、彼らが行動をサポートすることを宣言abなどの任意のモジュールを意味

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

:その後、モジュールにこのようなsome_behaviourものを作成some_behaviourはこれらの関数を定義しなければなりません。静的解析などのために、ここではパラメータのタイプと戻り値も定義しています。

+0

ありがとうございました。それはまさに私が必要なものです。私の問題は解決されました。 – cactus

関連する問題