【问题标题】:Erlang Pattern matching with aliasesErlang 模式匹配别名
【发布时间】:2010-12-13 05:43:45
【问题描述】:

是否有可能在函数定义中匹配做某个 touple 的某个子集,并且仍然在方法中得到完整的 touple?

我想做的是这样的:

myfun({ foo, Bar }: Var) -> otherfunction(Var, stuff).

代替:

myfun({ foo, Bar }) -> otherfunction({ foo, Bar }, stuff).

我希望这已经足够清楚了。

谢谢。

【问题讨论】:

  • 能否请您重新表述您的问题?这对我来说不是很清楚......
  • 好吧,我可能应该收回它,你确实为我回答了,= Var 部分正是我要找的。事后看来,RTFM 应该是正确的答案。

标签: erlang pattern-matching


【解决方案1】:

也许这就是你的意思:

myfun({foo, Bar } = Var) ->
  otherfunction(Var, stuff).

通过这种方式,您可以将函数导出为 myfun/1(一个参数)。它将仅匹配具有两个元素的元组。第一个必须是“foo”原子,而第二个可以是任何东西。在所有其他情况下,您将获得一个函数子句,除非您为该函数指定不同的子句。例如,有:

myfun({foo, Bar } = Var) ->
  otherfunction(Var, stuff);
myfun(Var) ->
  {error, bad_format}.

不过,我不完全确定这是您要问的。请让我知道这是否有帮助。

【讨论】:

    【解决方案2】:

    您可以通过在前面加上下划线来忽略某些参数。例如

    myfun( {foo, _Bar, Var } )

    将通过忽略 _Bar 参数进行匹配。这就是你的想法吗?

    或者你的意思是:

    myfun( {foo, Bar} = Var ) -> otherfun( Var ).

    在这种情况下,如果与 myfun 匹配成功,Var 将用于 otherfun。原因是:Var 在计算表达式时未绑定,因此将分配给 {foo, Bar}

    【讨论】:

    • “忽略 _Bar 参数”并不完全正确。变量 _Bar 将绑定到元组的第二个元素,并且可以用作任何普通变量。由于 _Bar 以 _ 开头,编译器不会警告它没有被使用。除此之外,_Bar 的行为就像一个普通变量,可以作为一个变量使用。
    【解决方案3】:

    如果我有这个正确的,你想要的是设置Var,只包含一个匹配{ foo, Bar }的touple,为了简洁起见,不需要做任何额外的检查。 据我所见,你不能在 Erlang 中做到这一点。对不起。 :)

    【讨论】:

    • 这是不正确的。正如另外两篇文章所表明的那样,您确实可以按照他的要求去做。
    猜你喜欢
    • 2014-06-27
    • 2018-12-08
    • 2011-08-14
    • 2011-06-17
    • 2013-08-15
    • 2011-09-29
    • 2014-07-26
    • 2015-01-12
    • 2015-02-09
    相关资源
    最近更新 更多