下面的代码是做什么的?当有一个元素而不是元素时,我如何编写这个OCL表达式?
换句话说,我不明白代码收集了哪些元素?由于当我们有多个元素时使用" collect“,如果我有一个元素(而不是元素),那么该表达式的"-> collect (s|thisModule.CreateMatchClass(s))”部分会发生什么变化呢?
s.source.elements -> collect (s|thisModule.CreateAnyMatchClass(s))

发布于 2017-01-23 08:10:04
OCL表达式只是从thismodule中的元素中“创建”元素(关于s.source函数的名称)。然后将创建的元素作为Collection返回。
s.source.elements通过从s导航返回(据说)一个Collection (可能是一个Set/Sequence...)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)https://stackoverflow.com/questions/41781254
复制相似问题