为什么要声明一个永远不会被使用的变量或函数? (_foo)

时间:2016-07-06 19:56:59

标签: elixir

我是Elixir的新手,在阅读了下划线变量/函数here之后,我对他们的实际用例感到有些困惑。为什么要定义永远不会使用的变量或函数呢?

我很熟悉在模式匹配中使用_当你想忽略匹配的某些部分,并且可能它们是密切相关的,但我在这种情况下挣扎。

3 个答案:

答案 0 :(得分:4)

我不确定忽略函数的用例,但是忽略变量的用法是给变量一个名字,这样如果你想在将来取消它,那你知道哪一个无所不在比较这两个例子:

def process_result({:ok, _, _, duration, count} do
  # do something with duration & count
end

def process_result({:ok, _timestamp, _user, duration, count} do
  # do something with duration & count
end

想象一下,几个月后回来读这段代码。在第一个示例中,如果不查看代码并查找调用此函数的位置,则无法立即清楚这两个忽略的值是什么。它是时间戳然后是用户,还是用户然后是时间戳?

在第二个示例中,非常清除这两个值是时间戳,然后用户。如果您稍后关注这些值中的任何一个,那么非常很容易删除下划线并按照函数中的正常情况访问变量:

def process_result({:ok, _timestamp, user, duration count} do
  # do something with user, duration and count
end

值得注意的是,如果你使用下划线前缀变量,Elixir会给你一个警告。这是一个小例子函数,它会发出警告:

fn(_x) -> _x end

这是警告(我在一些换行符中添加):

warning: the underscored variable "_x" is used after being set. 
 A leading underscore indicates that the value of the variable 
 should be ignored. If this is intended please rename the 
 variable to remove the underscore
  iex:1

答案 1 :(得分:2)

主要原因是多子句函数中使用的模式匹配:

def process( :drivers_license, number ) do
  # process here ...
end

def process( :passport, number ) do
  # process here ...
end

def process( :unkown, _ ), do: nil

答案 2 :(得分:1)

以这种方式声明的函数将从导入中排除,但可以在内部使用。

函数参数(也是变量)必须设置,因为arity是固定的,下划线使它们的使用更透明:我知道我的回调有3个参数,但我只需要第二个。

我不知道是否有通过这种方式声明的正常变量。