【发布时间】:2015-12-28 03:55:13
【问题描述】:
在 Elixir 中有一个通用规则,用 _ 命名任何未使用的变量。这样做会阻止任何东西绑定到该变量。
但是,我注意到一种广泛使用的模式,即用下划线作为前缀来表示被忽略的参数,形式为 _tail(目的是提供关于变量将是什么的提示)。
如果您尝试访问 _tail,该语言会通过 shell 中的警告鼓励这样做:
警告:下划线变量“_tail”在设置后使用。前导下划线表示应该忽略变量的值。如果这是有意的,请重命名变量以删除下划线
但这里有一个问题; _tail 绑定了变量,而仅使用 _ 时没有。
这是否意味着在使用 _ 以外的任何名称命名忽略的变量时会降低性能?或者 Elixir 是否仍然在幕后绑定 _,并且在任何尝试访问时都会出错?
编辑:看起来 Erlang 编译器专门优化了这种情况,将_* 视为_,因此没有开销,来源:http://erlang.org/doc/efficiency_guide/myths.html
【问题讨论】:
-
"真正的问题是程序员在错误的地方和错误的时间花费了太多时间来担心效率;过早的优化是万恶之源(或者至少是大部分)在编程中。” ——唐纳德·克努斯。当您发现代码中的性能问题而不是之前的问题时,请担心性能损失。
-
@OnorioCatenacci 我更感兴趣的是它的工作原理,而不是目前使用它来提高性能。一般来说,我同意您使用的报价,但是在成为问题之前不担心某事是一种非常无知的工作方式。例如;我可能永远不会知道这个问题的答案,因为我怀疑任何事情都值得如此仔细地观察性能。
-
@OnorioCatenacci 完全同意,如果您的代码无法正常工作,那就不值得了。您描述的过程,我基本上处于使其快速的最后阶段 - 但客户是我自己(副项目)。这就是导致我提出上述问题的原因 - 但只是因为我想知道它实际上有什么不同(如果有的话),而不是怀疑它是否存在任何特定问题。
-
顺便说一句,Elixir Core 邮件列表中的这个线程中有一些关于 _var 与 _ 的讨论:groups.google.com/forum/#!searchin/elixir-lang-core/underscore/… 我不确定它是否是您正在寻找的,但 FWIW。
-
啊,好的。我确实误解了你的问题的性质然后@zackehh。对于造成的误解,我深表歉意。
标签: elixir