2014-12-28 4 views
4

«for» всегда проверяет тип первого аргумента в каждой функции, определенной в протоколе?Что на самом деле означает «для» в «defimpl» в Elixir?

EDIT (перефразирование): Когда метод протокола имеет только один аргумент, реализация определяется на основе типа этого единственного аргумента (прямого или как Any). Когда метод протокола имеет несколько аргументов, какой из них используется для поиска соответствующей реализации? Всегда ли это первый? Можно ли это изменить?

ответ

5

Реализация всегда определяется на основе первого аргумента.

Когда вы определяете протокол, генерируется общий модуль протокола. Все предложения def в этом модуле будут выполнять делегирование конкретных функций, определяющих, какую функцию вызывать, исходя из типа первого аргумента.

место в источнике Elixir, где это происходит here (где первый аргумент явно упоминается как t), и here (где t передается impl_for! получить модуль, где переадресуется вызов функции).

A defimpl будет генерировать конкретные модули, имена которых соответствуют внутренним соглашениям, используемым defprotocol. Таким образом, обеспечивается, чтобы вызов функции был делегирован на конкретный конкретный модуль.

0

Полагаю, что for определяет, для какого типа используется протокол. Когда функция, указанная в протоколе, вызывается по значению, Elixir проверяет, существует ли реализация этой функции для этого типа. Конечно, есть некоторые особые случаи, такие как возврат к Any и встроенные протоколы. Но чтобы ответить на ваш вопрос, да, насколько я знаю, тип всегда проверяется.

Больше можно узнать, проверить исходный код:

https://github.com/elixir-lang/elixir/blob/150a8a1dcd3610d5ff875e00a1c8779894456ca6/lib/elixir/lib/protocol.ex#L522 https://github.com/elixir-lang/elixir/blob/150a8a1dcd3610d5ff875e00a1c8779894456ca6/lib/elixir/lib/protocol.ex#L456

EDIT

Оказывается, что тип первого аргумента это единственное, что имеет значение.

Начиная с линии 28 в protocol.ex, кажется, что первый аргумент является единственным, который принимается во внимание: https://github.com/elixir-lang/elixir/blob/150a8a1dcd3610d5ff875e00a1c8779894456ca6/lib/elixir/lib/protocol.ex#L28

Из того, что я понимаю только тип первого аргумента принимается во внимание. Типы всех остальных значений игнорируются.

+0

Я немного перефразировал вопрос, надеюсь, что теперь это более ясно. Я понимаю, что тип как-то проверен, но я не уверен, что именно проверяется. –

+0

Спасибо! Теперь я лучше понимаю. – Stratus3D

Смежные вопросы