【问题标题】:Erlang argument matching and performanceErlang 参数匹配和性能
【发布时间】:2011-06-30 07:10:52
【问题描述】:

从性能(或任何其他)角度来看,这两者之间有什么区别?

f1(X=whatever) -> 好的; (更多...)

f2(whatever=X) -> 好的; (更多...)

【问题讨论】:

  • 为什么使用赋值作为模式匹配表达式?这非常令人困惑。你不是说“f1() when X = 不管”吗?
  • Erlang 中的赋值是与未绑定变量进行模式匹配的效果——至少对我来说并不令人困惑。
  • 我在参数中使用赋值的原因是我可以稍后在代码中使用分配的变量。上面的代码太简单了,无法显示,但如果我在一些复杂的列表或元组上匹配,我可以稍后使用分配的变量,而不是输入复杂的结构。我的假设是引擎将在复杂结构上进行模式匹配,而不是变量(这是我想要的)。我的问题是这是否正确,即上面是否总是匹配原子“whatever”(我想要的)或者它有时是否匹配 X。

标签: performance erlang matching


【解决方案1】:

您可以通过使用 -S 编译生成 .S 文件来检查编译器生成的代码。您会得到类似的结果,并且可以确认编译器会为您的两种情况生成完全相同的代码。

{function, f1, 1, 12}.
{label,11}.
{func_info,{atom,test},{atom,f1},1}.
{label,12}.
{test,is_eq_exact,{f,11},[{x,0},{atom,whatever}]}.
return.

就我个人而言,我发现“whatever=X”违反直觉且难以阅读。

【讨论】:

  • 我也是,但有趣的是,我看到一些开发人员在他们的代码中使用这种风格,而我使用 X=whatever,这就是我决定问这个问题的原因(也许他们知道的比我?)。
  • 我更喜欢whatever=X。对我来说,= 的行为就像它在正文中的行为:RHS 是一个变量/值,而 LHS 是一个与之匹配的模式。正如@cthulahoops 所说,它对生成的代码没有影响,LHS 和 RHS 是 aliases
【解决方案2】:

模式中的= 表示LHS 和RHS 是别名,指的是数据相同的值。双方都必须匹配该值,因此编写 {X}=[Y] 永远不会匹配(并且编译器会抱怨)。它最常使用,如{X,Y}=T,它允许您匹配和分离数据并且仍然具有对整个结构的引用。既要吃蛋糕又要吃。请注意,它可以在模式中的任何位置使用,而不仅仅是在顶层,因此您可以像 {foo,[H|T]=A,B,C} 一样使用它。

没有性能差异。

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 2011-07-30
    • 2016-10-27
    • 2011-09-29
    • 2011-10-12
    • 2015-06-12
    • 2012-06-08
    • 2014-06-27
    • 2021-12-08
    相关资源
    最近更新 更多