什么"为" in" defimpl"在Elixir实际检查?

时间:2014-12-28 16:38:18

标签: protocols elixir

" for"总是检查协议中定义的每个函数中第一个参数的类型?

编辑(改述): 当protocol方法只有一个参数时,根据这个参数的类型(直接或任意)找到实现。当protocol方法有多个参数时,哪一个用于查找相应的实现?它总是第一个吗?可以改变吗?

2 个答案:

答案 0 :(得分:7)

实施始终根据第一个参数确定。

定义协议时,将生成通用协议模块。该模块中的所有def子句将执行具体函数的委派,根据第一个参数的类型确定要调用的函数。

Elixir源中发生这种情况的地方是here(第一个参数明确称为t),here(其中t传递给{ {1}}获取转发函数调用的模块。

impl_for!将生成具体模块,其名称符合defimpl使用的内部约定。因此,确保将函数调用委托给适当的具体模块。

答案 1 :(得分: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

修改

看来第一个参数的类型是唯一重要的。

从protocol.ex第28行开始,似乎第一个参数是唯一被考虑的参数:https://github.com/elixir-lang/elixir/blob/150a8a1dcd3610d5ff875e00a1c8779894456ca6/lib/elixir/lib/protocol.ex#L28

根据我的理解,只考虑第一个参数的类型。忽略所有其他值的类型。