" for"总是检查协议中定义的每个函数中第一个参数的类型?
编辑(改述): 当protocol方法只有一个参数时,根据这个参数的类型(直接或任意)找到实现。当protocol方法有多个参数时,哪一个用于查找相应的实现?它总是第一个吗?可以改变吗?
答案 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
根据我的理解,只考虑第一个参数的类型。忽略所有其他值的类型。