我是Elixir的新手,在阅读了下划线变量/函数here之后,我对他们的实际用例感到有些困惑。为什么要定义永远不会使用的变量或函数呢?
我很熟悉在模式匹配中使用_当你想忽略匹配的某些部分,并且可能它们是密切相关的,但我在这种情况下挣扎。
答案 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个参数,但我只需要第二个。
我不知道是否有通过这种方式声明的正常变量。