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

之前,_a5 之间只是模式匹配而已

_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},但是如果不检查下面的函数实现,那么整数指的是什么就不会很明显了。