下面的代码有什么作用?当只有一个元素而不是元素时,如何编写此 OCL 表达式?
换句话说,我不明白代码收集了哪些元素?由于当我们有多个元素时使用“收集”,如果我有一个元素(而不是元素),那么该表达式的“->收集(s|thisModule.CreateMatchClass(s))”部分会发生什么变化?
s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))
下面的代码有什么作用?当只有一个元素而不是元素时,如何编写此 OCL 表达式?
换句话说,我不明白代码收集了哪些元素?由于当我们有多个元素时使用“收集”,如果我有一个元素(而不是元素),那么该表达式的“->收集(s|thisModule.CreateMatchClass(s))”部分会发生什么变化?
s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))
您的 OCL 表达式只是thismodule
从s.source
. 然后将创建的元素作为 a 返回Collection
:
s.source.elements
通过导航返回(假设) a Collection
(可能是 a )Set/Sequence...
s
collect(...)
收集其参数表达式的结果elements
是or ,如何更改表达式?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)