我已经定义了Foo这样一个模块:
defmodule Foo do
def hello(x = %{name: name}) do
IO.inspect [x, name]
end
end
Run Code Online (Sandbox Code Playgroud)
如果我运行Foo.hello(%{name: "Alice"}),我得到以下结果:
[%{name: "Alice"}, "Alice"]
Run Code Online (Sandbox Code Playgroud)
然后,我了解到我可以在Foo不改变其功能的情况下重写模块:
defmodule Foo do
def hello(%{name: name} = x) do
IO.inspect [x, name]
end
end
Run Code Online (Sandbox Code Playgroud)
为什么这是可能的?函数参数中的等号是什么?它是普通的匹配算子吗?
根据我的理解,操作员=将右侧的值与左侧的图案进行匹配.
[编辑]
看完贾斯汀的回答后,我自己发了一个答案.但是,我仍然需要帮助.
我想知道=运算符在函数头中是否表现不同以及为什么.
如果可以的话,我想找一份官方文件.
它确实仍然是匹配运算符。
您可以这样做的原因与您可以这样匹配的原因相同
iex(1)> 1 = x
** (CompileError) iex:3: undefined function x/0
iex(2)> x = 1
1
iex(3)> 1 = x
1
Run Code Online (Sandbox Code Playgroud)
在函数头内部,x只要您使用该函数并将参数传递给它,就会有一个值(与您可以将函数定义为的原因相同def hello(x) do ... end)。这意味着您可以在匹配运算符的右侧使用它。
| 归档时间: |
|
| 查看次数: |
589 次 |
| 最近记录: |