假设我有:
visit(p) {
case ...
default:
println("This should not happen. All elements should be catched. Check: <x>");
};
如何打印(在本例中为 x)无法匹配的内容?
我试过了:
x:default:
\x:default:
default:x:
\default:x:
发送,
乔斯
假设我有:
visit(p) {
case ...
default:
println("This should not happen. All elements should be catched. Check: <x>");
};
如何打印(在本例中为 x)无法匹配的内容?
我试过了:
x:default:
\x:default:
default:x:
\default:x:
发送,
乔斯
我们有一个名为的库Traversal
,可让您取回匹配的上下文。因此,您可以执行以下操作:
import Traversal;
import IO;
void doit() {
m = (1:"one",2:"two",3:"three");
bottom-up visit(m) {
case int n : println("<n> is an int");
default: {
tc = getTraversalContext();
println("Context is: <tc>");
println("<tc[0]> is not an int");
if (str s := tc[0]) {
println("<s> is a string");
}
}
}
}
tc
然后是返回术语顶部的所有节点的列表 - 在这种情况下,它将只是当前值,例如"three"
,以及 map 的整个值m
(或整个 map,这也将是匹配默认情况下)。如果你有一些结构为树的东西,例如使用 ADT 或节点形成的术语,你会得到从匹配点回到顶部的所有中间结构(这将是整个术语)。
但是,出于某种原因,它default
多次匹配同一个术语。我已在 GitHub 上将此作为错误报告https://github.com/cwi-swat/rascal/issues/731提交。
你也可以试试这个成语:
visit(x) {
case ...
case ...
case value x: throw "default case should not happen <x>";
}
价值模式将捕获一切,但只有在其他人尝试之后。