提问人:Teun M. 提问时间:12/12/2022 最后编辑:Teun M. 更新时间:12/12/2022 访问量:28
Rascal MPL 重载库函数
Rascal MPL overload library functions
问:
像这样很容易重载你自己的函数:
void testVal(loc l) {
println("LOC <l>");
}
void testVal(value v) {
println("VAL <v>");
}
这样将调用第一个方法。我希望对以下方面做同样的事情:testVal(|tmp:///|)
IO::println
void println(loc l) {
IO::println("my custom println function");
}
用于调试目的。 现在应该打印 .可以这样做吗?对我来说,这段代码仍然默认为实现。println(|tmp:///|)
"my custom println function"
IO
答:
1赞
Jurgen Vinju
12/12/2022
#1
函数重载通过非确定性选择工作。因此,如果模式或重叠,则无法知道先选择哪一个。testVal
println
事实上,在您的示例中,与 so 重叠,两个备选方案之间的优先级是未定义的。loc l
value v
要解决这个问题,其中一个替代方案必须获得更精确的模式(例如,更改为以将其与 区分开来,或者您可以将修饰符放在函数之前:value v
num v
loc l
default
default void testVal(value v) {
println("VAL <v>");
}
如果你想覆盖一个没有修饰符的现有函数,恐怕你就不走运了。您无法更改 IO 模块以添加 .因此,要解决此问题,您可以将 IO::p rintln 函数包装在您自己的函数中:default
default
default void pln(value... v) {
println(v);
}
void pln(loc l) {
println("LOC <l>");
}
评论
0赞
Teun M.
12/12/2022
谢谢!符号是什么?是某种开箱吗?value... v
1赞
Jurgen Vinju
12/12/2022
O 这是像 C 和 Java 中的“varargs”一样,这意味着但在调用函数时不必放置方括号:list[value] v
pln(1, 2, 3)
评论