我使用Bold实现了OCL的Delphi。 OCL擅长过滤列表等。但我还没有找到一种通用的遍历链表的通用方法。
假设我有一个班级PlanMission
。它包含指向自身的单个链接PlanMission.previous
。它还有一个布尔属性isDummy
。
我希望遍历PlanMissions
的列表,直到我有isDummy
的实例。
我能做到
if isdummy then
self
else if previous->notEmpty and previous.isdummy then
previous
else if previous.previous->notEmpty and previous.previous.isdummy then
previous.previous
else
nil
endif
endif
endif
我真正想要的是这样的:
traverseList(previous, isDummy)
traverseList
不存在,但它应该有2个参数。
previous
:要关注的链接isDummy
:一个布尔条件,所以我知道何时停止如何实现这一目标?
修改说明 我不想要任何Delphi代码。我想要OCL中的代码。使用Bold的人知道我的意思。 OCL是一种具有查询对象,属性等的查询语言。它没有副作用,因此它是只读的。可以找到OCL简介here.
答案 0 :(得分:1)
您需要计算previous
关系的有序传递闭包。
(self,self.previous,self.previous.previous等)
在OCL 2.3.1中,它是self->asOrderedSet()->closure(previous)
然后您可以通过以下方式提取第一个虚拟PlanMission
(如果没有,则为null)
let c:Set(PlanMission) =
self->asOrderedSet()->closure(previous)->select(x|x.isDummy) in
if c->isEmpty() then null else select(x|x.isDummy)->first()
在OCL 2.3.1的第11.9节预定义迭代器表达式的映射规则中,closure
的{{1}}定义如果您的工具可以使用iterate
支持旧版本的OCL。