这个函数为什么不叫“Left”?

问题描述 投票:0回答:1

好吧,我真的觉得问这个很蠢,但我很好奇。

在 Jose 的 2023 年主题演讲中,他展示了这个示例,说明了为什么新类型实现无法防止某些错误:

def left and right do
  Enum.random([left, right])
end

所以为了看看他是否只是编造一些东西来表达他的观点,我在

iex
中尝试了它,果然——有一个
and
函数。让我困惑的是,为什么
left
不是函数的名称?函数名前后怎么可能有参数?

elixir
1个回答
0
投票

中,一切都是宏。

Kernel.def/2
也不例外。宏接收其参数的 AST 而不是参数本身。这就是实际收到的内容
Kernel.def/2
(为了清楚起见,我简化了该块)

iex|💧|1 ▶ quote do
...|💧|1 ▶   left and right do
...|💧|1 ▶     :ok
...|💧|1 ▶   end
...|💧|1 ▶ end
{:and, [context: Elixir, imports: [{2, M}]],
 [{:left, [], Elixir}, {:right, [], [[do: :ok]]}]}

也就是说,这是

Kernel.def/2
宏的职责,在 elixir 中提供

为了进一步参考,应该深入研究

:elixir_def
代码库。

© www.soinside.com 2019 - 2024. All rights reserved.