我具有以下功能:
public list[list[loc]] populateBeforeRemoval(){
list[list[loc]] dupList = [];
map[int, list[loc]] finalizedDups = ();
// Here some stuff is added to the finalizedDups map, however, I have omitted it for simplicity.
for(dup <- finalizedDups){
dupList+=finalizedDups[dup];
}
return dupList;
}
但是,当我运行此函数时,会得到以下输出:
|project://TestProject/src/astCreation.rsc|(4955,3,<142,40>,<142,43>): Expected list[list[loc]], but got list[value]
Advice: |http://tutor.rascal-mpl.org/Errors/Static/UnexpectedType/UnexpectedType.html|
当我单击该消息时,它指向代码中的返回值(dupList
)。看来添加finalizedDups[dup]
会删除列表的类型(list[loc]
)。这应该不可能吧?
仅出于完整性考虑,以下是整个(实际)功能:
public list[list[loc]] populateBeforeRemoval(list[list[loc]] dupList, list[loc] potentialDuplicates, list[loc] newPotentialDuplicates, loc location, int lineNumber){
map[int, list[loc]] finalizedDups = ();
for(dup <- potentialDuplicates, getSourceLength(dup)>=6){
bool sameIn = false;
for(pot <- newPotentialDuplicates){
if(pot.uri == dup.uri && pot.begin.line == dup.begin.line){
sameIn = true;
}
}
if(!sameIn){
int srcLength = getSourceLength(dup);
if(srcLength in finalizedDups){
finalizedDups[srcLength]+=dup;
} else {
location.end.line = lineNumber-1;
location.begin.line = lineNumber-srcLength-1;
finalizedDups[srcLength]=[location, dup];
}
}
}
for(dup <- finalizedDups){
dupList+=finalizedDups[dup];
}
return dupList;
}
更新:
开始时,此代码在eclipse IDE中显示了很多错误。将dup
重命名为其他错误后,大多数错误都消失了。可能是因为dup
是我导入的List.rsc
(http://tutor.rascal-mpl.org/Rascal/Libraries/Prelude/List/dup/dup.html)中的一个函数。似乎与Eclipse插件有关,显示为错误的行在运行时不会产生错误。
但是主要问题没有解决。我认为此问题是由于将列表追加到列表列表而引起的。
答案 0 :(得分:1)
好的代码。让我们来看看。只是从读取未运行开始,我怀疑+ =运算符将元素类型扩展为“值”。
须知:
不请自来的旁注:理解和关系运算符通常更快:
for(dup <- finalizedDups){
dupList+=finalizedDups[dup];
}
可能是: dupList + = [* finalizedDups [dup] | dup <-finalizedDups)];
然后+ =是单个串联,生成器像以前一样循环键,而*将每个列表值从映射中拼接到结果列表中。我只是想一想就没有测试。这样做更快,因为Rascal可以在列表理解完成之前使用瞬态可变状态,而for循环替代方案则不假设任何内容,仅使用不可变的内部API。