Elixir:使用下划线和赋值作为参数的函数调用
Elixir: functions call with underscore and assignment as parameters
在下面的代码中使用 _a = 5 而不是 5 的目的是什么?这项技术有名称吗?
def some_func(a) do
IO.puts(a)
end
some_func(_a = 5)
我认为在正确调用 some_func
之前,_a
和 5
之间只是模式匹配而已
_a = 5
的结果是5
。
a = 5
也是 5
甚至 5 = 5
,你猜对了,它是 5
。
所以在执行时发生的是
some_func(_a = 5)
some_func(5)
尽管不鼓励这种 _
之前的用法,除了在函数声明中,因为它用于告诉编译器该变量确实没有在函数体中使用。
有时我会在这种情况下使用该技术:
defmodule A do
def compute(list, x), do: _compute(list, x, [])
defp _compute([head|tail], x, acc) do
#
val = ...
_compute(tail, x, [val|acc])
end
end
然后我会写:
|
|
defmodule A do V
def compute(list, x), do: _compute(list, x, _acc=[])
为了向初学者表明 []
是什么。但是,在您发布的只有一个参数变量的示例中,我认为它没有说明任何问题。
这在Naming Conventions中有描述:
Underscore (_foo
)
Elixir relies on underscores in different situations.
For example, a value that is not meant to be used must be assigned to
_
or to a variable starting with underscore:
iex> {:ok, _contents} = File.read("README.md")
这里有一段 José Valim 的视频:
https://www.youtube.com/watch?v=1rFlhFbJ1_s&t=246s
他正在编写以下 Enum.reduce/3
电话:
|> Enum.reduce({_depth = 0, _position = 0}, fn
{:forward, value} -> {depth, position} -> {depth, position + value}
...
end
这里累加器的初值写成{_depth = 0, _position = 0}
。未使用 _depth
和 _position
变量,它们只是给开发人员的提示。他本可以直接写成 {0, 0}
,但是如果不检查下面的函数实现,那么整数指的是什么就不会很明显了。
在下面的代码中使用 _a = 5 而不是 5 的目的是什么?这项技术有名称吗?
def some_func(a) do
IO.puts(a)
end
some_func(_a = 5)
我认为在正确调用 some_func
_a
和 5
之间只是模式匹配而已
_a = 5
的结果是5
。
a = 5
也是 5
甚至 5 = 5
,你猜对了,它是 5
。
所以在执行时发生的是
some_func(_a = 5)
some_func(5)
尽管不鼓励这种 _
之前的用法,除了在函数声明中,因为它用于告诉编译器该变量确实没有在函数体中使用。
有时我会在这种情况下使用该技术:
defmodule A do
def compute(list, x), do: _compute(list, x, [])
defp _compute([head|tail], x, acc) do
#
val = ...
_compute(tail, x, [val|acc])
end
end
然后我会写:
|
|
defmodule A do V
def compute(list, x), do: _compute(list, x, _acc=[])
为了向初学者表明 []
是什么。但是,在您发布的只有一个参数变量的示例中,我认为它没有说明任何问题。
这在Naming Conventions中有描述:
Underscore (
_foo
)Elixir relies on underscores in different situations.
For example, a value that is not meant to be used must be assigned to
_
or to a variable starting with underscore:iex> {:ok, _contents} = File.read("README.md")
这里有一段 José Valim 的视频:
https://www.youtube.com/watch?v=1rFlhFbJ1_s&t=246s
他正在编写以下 Enum.reduce/3
电话:
|> Enum.reduce({_depth = 0, _position = 0}, fn
{:forward, value} -> {depth, position} -> {depth, position + value}
...
end
这里累加器的初值写成{_depth = 0, _position = 0}
。未使用 _depth
和 _position
变量,它们只是给开发人员的提示。他本可以直接写成 {0, 0}
,但是如果不检查下面的函数实现,那么整数指的是什么就不会很明显了。