【发布时间】:2011-07-31 19:17:14
【问题描述】:
我正在学习 erlang,但我偶然发现了一些我不太理解的行为。拿这段代码。 (我知道我正在编程的现有库,但正如我所说,我这样做是出于教育目的):
-module (codec).
-compile (export_all).
-record (node, {symbol, weight, order, left, right, parent} ).
-record (tree, {root, nodes} ).
highestOrderForWeight (Weight, Tree) ->
lists:max ( [Node#node.order || Node <- Tree#tree.nodes, Node#node.weight == Weight] ).
swapMaybe (Node, Tree) ->
case highestOrderForWeight (Node#node.weight, Tree) of
Node#node.order -> pass;
Node#node.parent -> pass;
Tree#tree.root -> pass;
Partner -> io:format ("Swapping ~p with ~p.~n", [Node#node.order, Partner] )
end.
编译器根本不喜欢我的代码:
./so.erl:11: illegal pattern
./so.erl:12: illegal pattern
./so.erl:13: illegal pattern
error
在模式中消化记录似乎有些麻烦,因为当我将代码更改为这种笨拙的解决方法时,它编译得很好:
swapMaybe2 (Node, Tree) ->
[Order, Parent, Root] = [Node#node.order, Node#node.parent, Tree#tree.root],
case highestOrderForWeight (Node#node.weight, Tree) of
Order -> pass;
Parent -> pass;
Root -> pass;
Partner -> io:format ("Swapping ~p with ~p.~n", [Node#node.order, Partner] )
end.
问题:
- 如何以模式访问记录字段?
- 如果不可能这样做,为什么会这样?
- 如果不能这样做,解决此问题的常见做法是什么?
【问题讨论】:
标签: erlang design-patterns record