使用Rascal MAP

时间:2015-10-16 17:37:08

标签: dictionary rascal

我正在尝试创建一个空映射,然后将在for循环中填充。不确定如何在Rascal进行。出于测试目的,我尝试了:

rascal>map[int, list[int]] x;
ok

但是,当我尝试使用:

填充“x”时
rascal>x += (1, [1,2,3])
>>>>>>>;
>>>>>>>;
        ^ Parse error here

我有一个解析错误。

2 个答案:

答案 0 :(得分:3)

首先,最好为其分配一个初始值。您不必在控制台上执行此操作,但如果您在脚本中声明变量,则必须执行此操作。此外,如果您要使用+=,则必须已经指定了值。

rascal>map[int,list[int]] x = ( );
map[int, list[int]]: ()

然后,当您将项目添加到地图中时,键和值之间用:分隔,而不是,,因此您需要这样的内容:

rascal>x += ( 1 : [1,2,3]);
map[int, list[int]]: (1:[1,2,3])

rascal>x[1];
list[int]: [1,2,3]

更简单的方法是使用与上面显示的查找类似的表示法:

rascal>x[1] = [1,2,3];
map[int, list[int]]: (1:[1,2,3])

通常,如果您只是设置一个键的值,或者在循环内分配键,x[key] = value更好,+=如果您将两个现有地图一起添加并保存导致其中一个。

答案 1 :(得分:2)

我有时也喜欢这个解决方案,你不是加入地图而只是更新某个键的值:

m = ();
for (...whatever...) {
   m[key]?[] += [1,2,3];
}

在此代码中,当密钥但仍存在于地图中时,它会以[]空列表开头,然后将[1,2,3]连接到它,或者如果键已经已经存在,假设它已经在[1,2,3],那么这将在地图中的特定键处创建[1,2,3,1,2,3]