与 Erlang 中的映射模式匹配时的非法表达式
Posted
技术标签:
【中文标题】与 Erlang 中的映射模式匹配时的非法表达式【英文标题】:Illegal expression when pattern matching with maps in Erlang 【发布时间】:2017-12-12 22:48:46 【问题描述】:我正在尝试在 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
【问题讨论】:
【参考方案1】:=>
用于构建地图。要对地图进行模式匹配,您需要改用:=
。
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 部分中有记录。
【讨论】:
【参考方案2】:代码示例前面有文字:
匹配地图字段的模式 我们在映射文字中使用的
:=
语法也可以用作映射模式。
该文本之前有一整节解释=>
和:=
在构建地图时的区别,因此您应该知道这两种不同的语法。
在书中,示例的第 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"
在这里可以一次抓取任意数量的项目的内容 时间,无论键的顺序如何。您会注意到元素已设置 与
=>
并匹配:=
。:=
运算符也可用于更新地图中的现有键
【讨论】:
以上是关于与 Erlang 中的映射模式匹配时的非法表达式的主要内容,如果未能解决你的问题,请参考以下文章