一般规则是在Elixir中使用_
命名任何未使用的变量。这样做会阻止绑定到该变量的任何内容。
然而,我注意到一种广泛使用的带有下划线的前缀模式,以_tail
的形式表示被忽略的参数(目的是提供关于变量的提示)。 / p>
如果您尝试访问_tail
,则会通过shell中的警告来鼓励这种情况:
警告:下划线变量" _tail"被设置后使用。前导下划线表示应忽略变量的值。如果是这样,请重命名变量以删除下划线
但这是抓住了; _tail
将变量绑定到它,而当仅使用_
时,它不会。
这是否意味着在使用除_
以外的任何内容命名忽略的变量时会有性能损失?或者Elixir仍然在幕后绑定_
,并且只是在任何访问尝试时出错?
编辑:看起来Erlang编译器专门优化了这种情况,将_*
视为_
,因此没有开销,来源:http://erlang.org/doc/efficiency_guide/myths.html < / p>
答案 0 :(得分:7)
鉴于每个人都已经放弃了免责声明而不担心这种性能行为,答案是:如果没有使用变量,编译器会注意到它,编译后的字节码会忽略它,就像你使用{{ 1}}。这就是为什么如果你_
而不是x = 1
,你会收到编译器警告的原因。
答案 1 :(得分:5)
确实,_
变量在Erlang(以及Elixir)中有特殊行为。
但除非你测量到这对你的应用程序来说是一个性能问题,否则我不会太担心这个问题。我想如果你在函数内部做了一些有趣的事情,那么绑定变量的开销将是完全无关紧要的。