7.6.5 Closure操作

前面章节介绍的迭代器从集合元素返回结果。closure支持从集合元素、集合的元素的元素、集合的元素的元素的元素(以此类推)返回结果。这对于迭代像UML泛化关系这样具有传递性的关系时很有用。closure操作使用与selectreject相同的迭代器语法:

source->closure(v: Type | expression-with-v)
source->closure(v | expression-with-v)
source->closure(expression)

closure迭代返回的集合是对递归调用过程中所返回的集合的每一个元素进行expression-with-v递归调用产生的集合与原有集合(source)的聚集。当expression-with-v返回空集或是返回的集合已经包括了之前聚集过的元素时该迭代才结束。结果集合的集合类型相对原有collection类型来说是Set或OrderedSet。如果source集合是有序的,那么结果是前序深度优先的。result满足如下后置条件:

post: result->includesAll(source)
post: result->asSet()=result->collect(expression)->asSet()

对于一个简单的父子关系和已知的父母:

parents->closure(children)

将计算产生父母、父母的孩子、父母的孩子的孩子......的集合。

在相反的方向上

self->asOrderedSet()->closure(mother)

将计算母系链。

对于一个更复杂的关系像UML的分类符泛化关系

aClassifier.generalization()->closure(general.generalization).general()->including(aClassifier)

将计算包括aClassifier在内的它的所有泛化的集合。该closure在具有传递关系的泛化上不断递归计算,不断从新产生的泛化分类符上获取其新的泛化。

如同所有的迭代器,self自始至终是不变的,在迭代过程中,有一个隐式的源(source)引用来解析特定的特征(feature)。

results matching ""

    No results matching ""