No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
Let is used to temporarily hold a value in an EAL expression. | |||
Let is very useful, but be careful when using when deleting objects and referencing derived expressiosn. | |||
==== Cause ==== | |||
But, it's '''not a variable, it's a reference'''. | |||
Also look at [[Derived attributes & associations|derived associations]] are used to create "shortcuts" in your model or to split complex navigations into parts. | |||
Both let refences and a combining these two can lead to unexpected results. | |||
==== Example with single link association ==== | ==== Example with single link association ==== | ||
Line 16: | Line 21: | ||
You might expect newPart.Name to hold 'copy of <name of the lastsubpart>', but it doesn't. | You might expect newPart.Name to hold 'copy of <name of the lastsubpart>', but it doesn't. | ||
That's because '''lp''' is NOT holding '''the object''', it's holding a '''subscription to the derivation to the object'''. | That's because '''lp''' is NOT holding '''the object''', it's holding a reference to the '''subscription to the derivation to the object'''. | ||
==== Solution ==== | |||
When the code does ''self.subParts.add(newPart)'', '''lp''' changes to point to the new object. | When the code does ''self.subParts.add(newPart)'', '''lp''' changes to point to the new object. | ||
Line 26: | Line 32: | ||
newPart.Name = 'copy of ' + lp.Name | newPart.Name = 'copy of ' + lp.Name | ||
) | ) | ||
The first operator here converts the object to a set and then takes the first, which is the object itself, '''not the subscription'''. | The first operator here converts the object to a set and then takes the first, which is the object itself, '''not the reference or subscription'''. |
Revision as of 13:37, 4 January 2022
Let is used to temporarily hold a value in an EAL expression.
Let is very useful, but be careful when using when deleting objects and referencing derived expressiosn.
Cause
But, it's not a variable, it's a reference.
Also look at derived associations are used to create "shortcuts" in your model or to split complex navigations into parts.
Both let refences and a combining these two can lead to unexpected results.
Example with single link association
If you have a derived single link association called lastSubPart, derived like
self.subParts->last
then you have a method with this content
let lp = self.lastSubPart in ( self.subParts.add(newPart); newPart.Name = 'copy of ' + lp.Name )
You might expect newPart.Name to hold 'copy of <name of the lastsubpart>', but it doesn't.
That's because lp is NOT holding the object, it's holding a reference to the subscription to the derivation to the object.
Solution
When the code does self.subParts.add(newPart), lp changes to point to the new object.
I.e. every time you use lp, the derived single link association is reevaluated.
let lp = self.lastSubPart->first in ( self.subParts.add(newPart); newPart.Name = 'copy of ' + lp.Name )
The first operator here converts the object to a set and then takes the first, which is the object itself, not the reference or subscription.