|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Двунаправленный связывают, позволяет обновлениям течь в любом направлении, а не только от связанного выражения до переменной, как мы обсудили выше.
var z = bind x with inverse;
Здесь, как прежде, если x изменяется, z обновляется к значению x. Но, с инверсией, средства, что, если z присваивается (или иначе изменяется) тогда значение x будет изменено на значение z. Например:
var note = "do";
var solfege = bind note with inverse;
println( "note={note}, solfege={solfege}" );
note = "re";
println( "note={note}, solfege={solfege}" );
solfege = "mi";
println( "note={note}, solfege={solfege}" );
note = "fa";
println( "note={note}, solfege={solfege}" );
| как с однонаправленным связывают, изменяя связанное выражение заменяет переменную | |
| но, с двунаправленным связывают, изменяя связанную переменную изменяет связанное выражение, определенно переменная, которая является связанным выражением |
note=do, solfege=do note=re, solfege=renote=mi, solfege=mi
note=fa, solfege=fa
Отметьте, что, потому что это должно быть присваиваемо, связанное выражение ограничивается тому, чтобы быть ссылкой на переменную. Это ограничение делает двунаправленным, связывают довольно неинтересный для локальных переменных, поскольку они - только другое имя для того же самого значения (как в примере выше). То, где они становятся интересными, находится в привязке между переменными экземпляра объектов. В этом примере переменная экземпляра x Точки projectionOnX двунаправлено связывается с переменной экземпляра другой точки (pt).
class Point {
var x : Number;
var y : Number;
override function toString() : String { "Point({x},{y})" }
}
def pt = Point {
x: 3.0
y: 5.0
}
def projectionOnX = Point {
x: bind pt.x with inverse
y: 0.0
}
println( pt );
println( projectionOnX );
pt.x = 7.6;
println( pt );
println( projectionOnX );
projectionOnX.x = 22.2;
println( pt );
println( projectionOnX );
| как с однонаправленным связывают, изменяя связанное выражение изменяет переменную экземпляра | |
| но, с двунаправленным связывают, изменяя связанную переменную изменяет связанное выражение, определенно переменная экземпляра, которая является связанным выражением |
Point(3.0,5.0) Point(3.0,0.0) Point(7.6,5.0) Point(7.6,0.0)Point(22.2,5.0)
Point(22.2,0.0)
Это особенно полезно во взаимодействии с пользователем, например выводя на экран хранимую сумму в доступном для редактирования поле. Если хранимая сумма изменяется, выведенное на экран значение должно измениться, но также и если пользователь редактирует значение, это должно быть сохранено.