Я изучаю эрланг и спотыкаюсь о каком-то поведении, которое не совсем понимаю.Возьми этот кусок кода.(Я знаю, что существуют библиотеки для того, что я программирую, но, как я уже сказал, я делаю это в образовательных целях):
-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.
Вопросы:
- Как получить доступ к полям записи в шаблонах?
- Если это невозможно, почему так?
- Если это невозможно сделатьИтак, что является обычной практикой, чтобы обойти это?