是否可以通过使用列表推导或类似的方式将这样的访问重写为一行?
list[str] nodeNames = [];
visit (ast) {
case someNode(str name): {
nodeNames += name;
}
};
答案 0 :(得分:5)
是的,您可以使用我们称之为后代匹配运算符/
:
[name | /someNode(str name) := ast];
你在这里看到
[
和]
之间的列表理解。:=
,左侧是模式,右侧是主题。/someNode(str name)
,它将匹配表单someNode(str name)
的每个子节点,并将绑定模式变量name
。整体效果与使用访问的配方相同:来自name
的所有someNode
字段都会被收集并放入列表中。这是解决问题的最短解决方案。