2016-03-27 10 views
2

私は、異なるアリティを持つ頭を持つ関数を持つモジュールを持っているとしましょう。利用可能なすべてのアーリー(明示されていない)のために別のモジュールでこの関数をインポートする方法はありますか?既存のアリティの関数をインポートできますか?

defmodule Math do 
    def plus(a, b) do 
    end 

    def plus(a, b, c) do 
    end 

    def plus(a, b, c, d) do 
    end 
end 

defmodule AdditiveCalculator do 
    # Explicit import 
    import Math, only: [plus: 2, plus: 3, plus: 4] 

    # What i'm hoping for 
    import Math, only: [plus: :all] 
end 
+1

Erlang/Elixirには可変量の引数はありません。長い値リストを要約する必要がある場合は、値リストを関数に渡します。これにより、「すべてインポート」の必要性が排除されます。 – tkowal

+0

もちろん、すべての関数が必要な場合は 'import Math'を使い、' only: 'オプションは使わないでください。そうすれば、モジュール内のすべての機能が提供されますが、これはあなたが求めているとは思えませんが、機能するはずです。 – CoderDennis

答えて

2

私が知る限り、エリクシルにはそのような機能はありません。

詳細はhereを参照してください。


EDIT:

@tkowalは、上記のコメントに大きなポイントが表示されます。整数の可変リストを合計しようとしているのであれば、適切な方法は、整数のリストとして引数を渡し、それを使って作業することです。これと同じように:次に

defmodule T do 
    def plus(l) when is_list(l), do: plus(l,0) 
    defp plus([], acc), do: acc 
    defp plus([item] = l, acc), do: acc + item 
    defp plus([head|tail] = l, acc), do: plus(tail, acc+head) 
end 

それを使用するには、このようにそれを呼び出す:

T.plus([1,2,3,4]) 
#=> 10 
+0

本当に 'defp plus([item] = l、acc)、do:acc + item'節が必要ですか?単一の項目リストの 'tail'は空のリストになるので、他の節はすべてのシナリオをカバーします。 – CoderDennis

+1

それは良い点@CoderDennisです。私はそれを再確認する必要がありますが、私はあなたが正しいと信じています。通常、ここにコードを投稿するとき、実際に制作に使用するものよりも教訓的な目的のために多くのことを行います。 –

2

あなたの質問はエリクシルの関数の性質に関する不正確な仮定を行います。あなたは、あなたは "異なるアリティを持つ頭を持つ機能"と "後の機能"を持っていると言います。

複数のヘッドを持つ単一の機能はありません。実際には3つの異なる機能があります。関数は、名前とアリティの両方によって識別されます。 plus/2,plus/3およびplus/4は名前を共有できますが、それらは同じ機能ではありません。 http://elixir-lang.org/crash-course.html#identifying-functions

これは、importonlyオプションを指定するときに明示的にリストする必要がある理由です。これらの3つの異なる機能をモジュールからインポートしています。

関連する問題