在Erlang中与地图匹配模式时的非法表达

时间:2017-07-08 21:54:53

标签: hashmap erlang records erl

我正在尝试在Armstrong的Erlang书籍的交互式shell上执行示例代码。这就是本书所说的情况:

1> Henry8 = #{ class => king, born => 1491, died => 1547 }. #{ born => 
1491, class=> king, died => 1547 }.
2> #{ born => B } = Henry8.
#{ born => 1491, class=> king, died => 1547 }.

然而,这是我在shell上得到的,似乎模式匹配失败了:

1> Henry8 = #{ class => king, born => 1491, died => 1547 }.
#{born => 1491,class => king,died => 1547}
2> #{ born => B } = Henry8.
* 1: illegal pattern

2 个答案:

答案 0 :(得分:3)

=>用于构建地图。要对地图进行模式匹配,您需要改为使用:=

1> Henry8 = #{ class => king, born => 1491, died => 1547 }.
#{born => 1491,class => king,died => 1547}
2> #{ born := B } = Henry8.
#{born => 1491,class => king,died => 1547}
3> B.
1491

这将在"模式中的地图" here

答案 1 :(得分:0)

代码示例前面是文本:

  

模式匹配地图的字段
  我们在地图文字中使用的:=语法也可以用作地图模式。

在构建地图之前,该文字前面有一整段解释=>:=之间的差异,因此您应该已经了解了两种不同的语法。

在书中,该例子的第2行说:

2> #{born := B} = Henry8.

但是在你输入的shell中:

2> #{ born => B } = Henry8.

我建议您稍微仔细阅读section 5.3,并阅读pertinent section of LYSE,其中包含此示例:

1> Pets = #{"dog" => "winston", "fish" => "mrs.blub"}.
#{"dog" => "winston","fish" => "mrs.blub"}

2> #{"fish" := CatName, "dog" := DogName} = Pets.
#{"dog" => "winston","fish" => "mrs.blub"}

7> CatName.
"mrs.blub"

8> DogName.
"winston"
     

在这里可以抓取任何数量的项目的内容   时间,无论按键顺序如何。您会注意到元素已设置   使用=>并与:=匹配。 :=运算符也可用于更新地图中的现有密钥