我无法弄清楚它是如何工作的。以下是Elixir文档的示例代码,以及我们关于它们如何工作的思考过程。如果出现问题,请告诉我。
# Code example from Elixir docs
users = [%{name: "john", age: 27}, %{name: "meg", age: 23}]
all = fn(:get, data, next) do
Enum.map(data, next)
end
get_in(users, [all, :age])
#=> [27, 23]
users
与包含两张地图的列表匹配。all
与以:get, data, next
为参数并执行Enum.map(data, next)
的函数匹配。Kernal.get_in(users, [all, :age])
被召唤。all
是一个函数,因此将其调用为all(:get, users, next)
。Enum.map
遍历users
的每个元素并在其上调用next
,返回一个列表。:age
键的值将作为列表返回。这些是基于此分析的问题:
next
?它从未被定义或提供,但是如何报告没有错误?get_in
)作为键调用all
时,它会返回键的值(在此示例中为:age
})从该函数的结果?答案 0 :(得分:1)
有两个完美的来源可以从中检索信息。第一个是Elixir Docs,即Kernel#get_in/2
的状态:
从嵌套结构中获取值。
[...]
如果一个键是一个函数,那么将调用该函数传递三个参数,即操作(
:get
),要访问的数据和下一个要调用的函数。
最终来源是Elixir源代码,我们可以在其中看到Kernel#get_in/2
in our particular case的确切实现。
那就是说,next
在这里扮演acc
的角色,将get_in
传递给尾递归,直到列表的尾部为空。
问题2在文档中得到了完美的回答。
问题3的答案是:another Kernel#get_in/2
将在上一步中匹配,递归将开始显示。