看起来很简单,我如何初始化一个空关系(比如 [str,int] 类型),然后向它添加新元素?一个近似的流氓代码:
rel[str,int] myReln={};
myReln.add(<"a",1>);
删除/修改操作的示例也将不胜感激。
看起来很简单,我如何初始化一个空关系(比如 [str,int] 类型),然后向它添加新元素?一个近似的流氓代码:
rel[str,int] myReln={};
myReln.add(<"a",1>);
删除/修改操作的示例也将不胜感激。
遵守两个原则很重要:
在您的示例中:
rel[str,int] myReln={};
,精细变量myRel
现在具有价值{}
。+
操作员完成的。在您的情况下,{} + <"a", 1>`。myRel
,您可以编写myRel = myReln + <"a", 1>
:myReln += <"a", 1>
.可以使用(在本例中)设置差异-
(
关系只是集合的一种特殊形式,因此集合上可用的所有操作也适用于关系。您的添加操作实际上是
myReln += < "a", 1 >;
或者
myReln = myReln + < "a", 1 >;
从关系中删除项目类似于将项目添加到关系中。如果您想从中删除元组< "a", 1>
,myReln
您只需编写
myReln = myReln - < "a", 1 >;
或者,作为简写
myReln -= < "a", 1 >;
如果您不知道整个元组,但知道要删除以 开头的任何元组"a"
,那么您(至少)有两个选择。最简单的是使用库domainX
中的Relation
函数:
import Relation;
myReln = domainX(myReln, {"a"});
这将删除所有具有"a"
作为其第一个元素的元组。你也可以在这个集合中有多个项目,所以如果你想删除任何以任一开头的元组,"a"
或者"b"
你可以说:
myReln = domainX(myReln, {"a","b"});
另一种选择是使用模式匹配和理解——基本上,通过查看关系中的每个项目并决定是否应该保留它来重建关系。那看起来像:
myReln = { <a,b> | <a,b> <- myReln, a != "a" };
那么修改就是一系列的添加和删除。由于关系是不可变的,我们没有就地修改的概念。
您可以在此处找到有关 Rascal 集的文档:http ://tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Expressions/Values/Set/Set.html 。为关系定义的特殊操作(同样,元组集)在这里:http ://tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Expressions/Values/Relation/Relation.html