假设我有:
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:
TX,
何
答案 0 :(得分:0)
我们有一个名为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"
,以及地图的整个值m
(或整个地图,也是默认情况下的匹配)。如果您有一些结构化的树,例如使用ADT或节点形成的术语,您将从匹配点返回到顶部(这将是整个术语)的所有干预结构。
但出于某种原因,default
多次匹配同一个词。我已经在GitHub上将此文件作为错误报告https://github.com/cwi-swat/rascal/issues/731提交。
答案 1 :(得分:0)
你也可以试试这个成语:
visit(x) {
case ...
case ...
case value x: throw "default case should not happen <x>";
}
值模式将捕获所有内容,但只有在尝试其他内容之后才会捕获。