2016-10-11 7 views
2

ネットワークでプロトコル(http、ftpなど)という用語を使用していたため、私はElixirでの使用法と混同しています。例えば、 EnumモジュールとEnumerableプロトコルへの参照があります。エリクシルの文書にはProtocols are a mechanism to achieve polymorphism in Elixirと書かれています。エリキシル中の議定書の意義は何ですか?

メソッド/関数のセットを持つモジュールではありませんか?何か区別はありますか?

+1

エリクシールにおけるプロトコルの使用は、一般的な目的C.などの言語で定義されている方法のプロトコルに似ていますオブジェクト指向言語では、実装することを約束する一連のメソッドを意味します。 –

+1

これは実際にSmalltalk(1980)に戻ります。すべての実用的な目的のためには、それをAPI、Interface ...と考えてください。 – cdegroot

答えて

4

PythonでのJava /抽象クラスインターフェースのようなプロトコルを考える(実際には、Javaインタフェースと特異的に抽象クラスをPythonは@behaviourによりであるが、いずれにせよ。)コードで

defprotocol Sound do 
    def make_sound(data) 
end 

defmodule Dog do 
    defstruct name: "Donny" 
end 

defimpl Sound, for: Dog do 
    def make_sound(data) do 
    "#{data.name} barks “woof”" 
    end 
end 

defmodule Cat do 
    defstruct name: "Hilly" 
end 

defimpl Sound, for: Cat do 
    def make_sound(data) do 
    "#{data.name} murrs “meow”" 
    end 
end 

、そこ。

%Dog{} |> Sound.make_sound 
#⇒ "Donny barks “woof”" 

か:

pet = .... # complicated code loading a struct 
pet |> Sound.make_sound # here we don’t care what pet we have 

このメカニズムは、文字列の補間に使用される:

"#{5}" 

上記作品IntegerString.Charsの実装を持っているからです。実装では、バイナリを取得するために

WHATEVER_IN_#{} |> String.Chars.to_string 

を呼び出すだけです。例えば。

defimpl String.Chars, for: Dog do 
    def to_string(term) do 
    "#{term.name} barks “woof”" 
    end 
end 

今1を補間するかもしれない犬::前述のDogモジュールのために、私たちはString.Charsを実装するかもしれません

"#{%Dog{}}" 
#⇒ "Donny barks “woof”" 
+0

defimplが実際に何をしているのかを調べると役に立つでしょう:関数to_stringを使ってモジュールString.Chars.Dogを作成します。 _build/test/protocol/ebinを見ると、実際に作成されたすべてのモジュールが表示されます。 –

+0

@FredtheMagicWonderDogはい、それは本当ですが、私は個人的にこれが実装の詳細であることを認識していますが、これはプロトコルの重要性を理解することが厳密には要求されていません。 – mudasobwa

+0

おそらく、私の経験では、エリクシール初心者のためのプロトコルの周りに不必要な謎がたくさんあるということです。実装の詳細を知ることで、謎を解くのに役立ちます。 –

関連する問題