ネットワークでプロトコル(http、ftpなど)という用語を使用していたため、私はElixirでの使用法と混同しています。例えば、 EnumモジュールとEnumerableプロトコルへの参照があります。エリクシルの文書にはProtocols are a mechanism to achieve polymorphism in Elixir
と書かれています。エリキシル中の議定書の意義は何ですか?
メソッド/関数のセットを持つモジュールではありませんか?何か区別はありますか?
ネットワークでプロトコル(http、ftpなど)という用語を使用していたため、私はElixirでの使用法と混同しています。例えば、 EnumモジュールとEnumerableプロトコルへの参照があります。エリクシルの文書にはProtocols are a mechanism to achieve polymorphism in Elixir
と書かれています。エリキシル中の議定書の意義は何ですか?
メソッド/関数のセットを持つモジュールではありませんか?何か区別はありますか?
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}"
上記作品Integer
はString.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”"
defimplが実際に何をしているのかを調べると役に立つでしょう:関数to_stringを使ってモジュールString.Chars.Dogを作成します。 _build/test/protocol/ebinを見ると、実際に作成されたすべてのモジュールが表示されます。 –
@FredtheMagicWonderDogはい、それは本当ですが、私は個人的にこれが実装の詳細であることを認識していますが、これはプロトコルの重要性を理解することが厳密には要求されていません。 – mudasobwa
おそらく、私の経験では、エリクシール初心者のためのプロトコルの周りに不必要な謎がたくさんあるということです。実装の詳細を知ることで、謎を解くのに役立ちます。 –
エリクシールにおけるプロトコルの使用は、一般的な目的C.などの言語で定義されている方法のプロトコルに似ていますオブジェクト指向言語では、実装することを約束する一連のメソッドを意味します。 –
これは実際にSmalltalk(1980)に戻ります。すべての実用的な目的のためには、それをAPI、Interface ...と考えてください。 – cdegroot