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=re note=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)
Это особенно полезно во взаимодействии с пользователем, например выводя на экран хранимую сумму в доступном для редактирования поле. Если хранимая сумма изменяется, выведенное на экран значение должно измениться, но также и если пользователь редактирует значение, это должно быть сохранено.