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";         1
println( "note={note},  solfege={solfege}" );
solfege = "mi";      2
println( "note={note},  solfege={solfege}" );
note = "fa";
println( "note={note},  solfege={solfege}" );

1

как с однонаправленным связывают, изменяя связанное выражение заменяет переменную

2

но, с двунаправленным связывают, изменяя связанную переменную изменяет связанное выражение, определенно переменная, которая является связанным выражением
note=do,  solfege=do
note=re,  solfege=re          1
note=mi,  solfege=mi          2
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;    1
println( pt );
println( projectionOnX );
projectionOnX.x = 22.2;   2
println( pt );
println( projectionOnX );

1

как с однонаправленным связывают, изменяя связанное выражение изменяет переменную экземпляра

2

но, с двунаправленным связывают, изменяя связанную переменную изменяет связанное выражение, определенно переменная экземпляра, которая является связанным выражением
Point(3.0,5.0)
Point(3.0,0.0)
Point(7.6,5.0)
Point(7.6,0.0)          1
Point(22.2,5.0)         2
Point(22.2,0.0)

Это особенно полезно во взаимодействии с пользователем, например выводя на экран хранимую сумму в доступном для редактирования поле. Если хранимая сумма изменяется, выведенное на экран значение должно измениться, но также и если пользователь редактирует значение, это должно быть сохранено.