我需要在OCL中执行2个函数来处理集合:forAll和filter。诀窍是我只能使用迭代器。
这就是我的意思:
context Collection(T)::forAll(expr) : Boolean
body : self -> iterate(t: T, acc: Boolean = true | expr(t) and acc)
context Collection(T)::filter(expr) : Collection(T)
body : self -> iterate(t: T, acc: Collection(T) = {} | if expr(t) then acc->include(t) else acc endif
请告诉我它是对还是错。
答案 0 :(得分:0)
您对forAll
的定义很好,实际上它与OCL Version 2.4的第11.9节(预定义迭代器表达式的映射规则)中给出的相同。
filter
操作等同于OCL定义的select
操作,其操作几乎与您的操作相同,但有以下区别:
acc->including(t)
而不是acc->include(t)
。 Collection
是一个抽象类型,然后我想你不能写acc:Collection(T) = {}
,因为acc
的实际类型是未定义的。相反,您可以使用Bag(T) = Bag{}
(但在这种情况下,Set(T)::filter(expr)
会返回Bag
而不是Set
)。 OCL规范通过为每种集合类型(然后我们有select
,Set(T)::select(body):Set(T)
等)单独定义Sequence(T)::select(body):Sequence(T)
来解决此问题,在每种情况下使用不同的累加器类型。< / p>