以下代码有什么作用?当有一个元素而不是元素时,如何编写这个OCL表达式?
换句话说,我不明白代码收集了哪些元素? 由于当我们有多个元素时使用“collect”,如果我有一个元素(而不是元素),那么“ - > collect(s | thisModule.CreateMatchClass(s))”表达式会发生什么变化?
s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))
答案 0 :(得分:1)
你的OCL表达只是简单地创造了'来自thismodule
中元素的元素(关于s.source
函数的名称)。然后,创建的元素将作为Collection
:
s.source.elements
从Collection
Set/Sequence...
(可能是s
)
collect(...)
收集其参数表达式的结果elements
不再是0..*
而是0..1
或1..1
,那么如何更改表达式?事实上,collect(...)
适用于集合,但->
也是Set
的隐式转换器。 OCL规范的第15页声明:
" - >"导航速记执行对象的隐式设置转换。
的简写
anObject->union(aSet)
是anObject.oclAsSet()->union(aSet)
这意味着element
(我删除了最后的' s)是一个"单身"关系和s.source.element
返回单个元素,调用s.source.element->...
相当于s.source.element.oclAsSet()->...
。在您的情况下,无论elements
是否很多,表达式仍然相同:
s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))
此表达式适用于两种情况。
如果你真的不想要collect
,如果你的elements
关系是单身,你也可以这样写:
thisModule.createAnyMatchClass(s.source.elements)