asdtiang的博客 感謝blogjava提供的博客交流平臺(tái)

          bind 關(guān)鍵字將目標(biāo)變量的值與綁定表達(dá)式的值相關(guān)聯(lián)。綁定表達(dá)式可以是某個(gè)基本類型的簡(jiǎn)單值、對(duì)象、函數(shù)的結(jié)果或表達(dá)式的結(jié)果。以下幾節(jié)分別提供每種綁定表達(dá)式 的示例。

          在大多數(shù)實(shí)際的編程情況下,需要通過(guò)數(shù)據(jù)綁定使應(yīng)用程序的圖形用戶界面 (Graphical User Interface, GUI) 與其底層數(shù)據(jù)同步。(GUI 編程是使用 JavaFX 構(gòu)建 GUI 應(yīng)用程序的主題;下面我們將用一些非可視的示例來(lái)說(shuō)明基本的底層結(jié)構(gòu)。)

          讓我們先看一個(gè)簡(jiǎn)單的示例:下面的腳本將變量 x 綁定到變量 y, 更改 x 的值,然后輸出 y 的值。由于這兩個(gè)變量綁定在一起,因此 y 值會(huì)自動(dòng)更新為新值。

          var x = 0;

          def y = bind x;

          x = 1;

          println(y); // y now equals 1

          x = 47;

          println(y); // y now equals 47
           

          請(qǐng)注意,我們已將變量 y 聲明為 def。這可防止任何代碼直接 為該變量賦值(盡管允許該變量的值因綁定 (bind) 而更改)。在綁定到對(duì)象時(shí),此約定仍適用(請(qǐng)回顧使 用對(duì)象中介紹的 Address):

          var myStreet = "1 Main Street";

          var myCity = "Santa Clara";

          var myState = "CA";

          var myZip = "95050";



          def address = bind Address {

          street: myStreet;

          city: myCity;

          state: myState;

          zip: myZip;

          };



          println("address.street == {address.street}");

          myStreet = "100 Maple Street";

          println("address.street == {address.street}");
           

          如果更改 myStreet 的值,address 對(duì)象內(nèi)部的 street 變量將受到影響:

          address.street == 1 Main Street

          address.street == 100 Maple Street
           

          請(qǐng)注意,更改 myStreet 的值實(shí)際上會(huì)導(dǎo)致創(chuàng)建一個(gè)新的 Address 對(duì)象,然后將該對(duì)象重新賦給 address 變量。為了跟蹤所做的更改而創(chuàng)建新的 Address 對(duì)象,請(qǐng)改為直接綁定 (bind) 到該對(duì)象的實(shí)例變量:

          def address = bind Address {

          street: bind myStreet;

          city: bind myCity;

          state: bind myState;

          zip: bind myZip;

          };
           

          如果要顯式綁定到實(shí)例變量,還可以省略第一個(gè) bindAddress 前面的那個(gè)):

          def address = Address {

          street: bind myStreet;

          city: bind myCity;

          state: bind myState;

          zip: bind myZip;

          };
           

          前面的課程已講授了函數(shù),但是您還必須了解綁定函數(shù)非綁定函數(shù)之間的區(qū)別。

          請(qǐng)考慮下面的函數(shù),該函數(shù)創(chuàng)建和返回一個(gè) Point 對(duì)象:

          var scale = 1.0;



          bound function makePoint(xPos : Number, yPos : Number) : Point {

          Point {

          x: xPos * scale

          y: yPos * scale

          }

          }



          class Point {

          var x : Number;

          var y : Number;

          }
           

          這就是所謂的綁定函數(shù),因?yàn)樗懊嬗?bound 關(guān)鍵字。


          注意:bound 關(guān)鍵字不能替換 bind 關(guān)鍵字;這兩個(gè)關(guān)鍵字按如下所示方式結(jié)合使用。

          接下來(lái),讓我們添加一些代碼來(lái)調(diào)用此函數(shù)并測(cè)試綁定:

          var scale = 1.0;



          bound function makePoint(xPos : Number, yPos : Number) : Point {

          Point {

          x: xPos * scale

          y: yPos * scale

          }

          }



          class Point {

          var x : Number;

          var y : Number;

          }



          var myX = 3.0;

          var myY = 3.0;

          def pt = bind makePoint(myX, myY);

          println(pt.x);



          myX = 10.0;

          println(pt.x);



          scale = 2.0;

          println(pt.x);
           

          此腳本的輸出如下所示:

          3.0

          10.0

          20.0
           

          讓我們分析一下此腳本(一次分析一部分)。

          代碼:

          var myX = 3.0;

          var myY = 3.0;

          def pt = bind makePoint(myX, myY);

          println(pt.x);
           

          將腳本變量 myXmyY 初始化為 3.0。 這些值隨后作為參數(shù)傳遞給 makePoint 函數(shù),該函數(shù)會(huì)創(chuàng)建并返回一個(gè)新的 Point 對(duì)象。bind 關(guān)鍵字(位于 makePoint 調(diào)用前面)將新創(chuàng)建的 Point 對(duì)象 (pt) 綁定到 makePoint 函數(shù)的結(jié)果。

          接下來(lái),代碼:

          myX = 10.0;

          println(pt.x);
           

          myX 的值更改為 10.0 并輸出 pt.x 的值。輸出表明 pt.x 現(xiàn)在也為 10.0

          最后,代碼:

          scale = 2.0;

          println(pt.x);
           

          更改 scale 的值并再次輸出 pt.x 的值。pt.x 的值現(xiàn)在為 20.0。但是,如果我們從該函數(shù)中刪除 bound 關(guān)鍵字(從而使其成為非綁定函數(shù)),則輸出應(yīng)為:

          3.0

          10.0

          10.0
           

          這是因?yàn)椋墙壎ê瘮?shù)只是在其某個(gè)參數(shù)發(fā)生變化時(shí)才被重新調(diào)用。由于 scale 不是函數(shù)的參數(shù),因此更改它的值將不會(huì)導(dǎo)致另一個(gè)函數(shù)調(diào)用。

          您還可以將 bindfor 表達(dá)式結(jié)合使用。為了對(duì)此進(jìn)行研究,讓我們首先定義兩個(gè)序列并輸出這兩個(gè)序列中各個(gè)項(xiàng)的值:

          var seq1 = [1..10];

          def seq2 = bind for (item in seq1) item*2;

          printSeqs();



          function printSeqs() {

          println("First Sequence:");

          for (i in seq1){println(i);}

          println("Second Sequence:");

          for (i in seq2){println(i);}

          }
           

          seq1 包含十個(gè)項(xiàng)(數(shù)字 1 至 10)。seq2 也包含十個(gè)項(xiàng);這些項(xiàng)本來(lái)會(huì)與 seq1 具有相同的值,但是我們已經(jīng)對(duì)其中的每個(gè)項(xiàng)都應(yīng)用了表達(dá)式 item*2, 因此它們的值將加倍。

          因此,輸出為:

          First Sequence:

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          Second Sequence:

          2

          4

          6

          8

          10

          12

          14

          16

          18

          20
           

          我們可以通過(guò)將 bind 關(guān)鍵字放在 for 關(guān)鍵字前面來(lái)綁定這兩個(gè)序列。

          def seq2 = bind for (item in seq1) item*2;
           

          問(wèn)題現(xiàn)在變成:“如果 seq1 發(fā)生了某些變化,那么是 seq2 中的所有項(xiàng)都受到影響還是部分項(xiàng)受到影響?”我們可以通過(guò)以下方法來(lái)對(duì)此進(jìn)行測(cè)試:將一個(gè)項(xiàng)(值 11)插入 seq1 的末尾處,然后輸出這兩個(gè)序列的值,看有什么變化:

          var seq1 = [1..10];

          def seq2 = bind for (item in seq1) item*2;

          insert 11 into seq1;

          printSeqs();



          function printSeqs() {

          println("First Sequence:");

          for (i in seq1){println(i);}

          println("Second Sequence:");

          for (i in seq2){println(i);}

          }
           

          輸出:

          First Sequence:

          1

          2

          3

          4

          5

          6

          7

          8

          9

          10

          11

          Second Sequence:

          2

          4

          6

          8

          10

          12

          14

          16

          18

          20

          22
           

          輸出表明,將 11 插入 seq1 的末尾處不會(huì)影響 seq2 中的前 10 個(gè)項(xiàng);新項(xiàng)會(huì)自動(dòng)添加到 seq2 的末尾處,其值為 22。

          替換觸發(fā)器是附加到變量的任意代碼塊,一旦變量的值發(fā)生變化,它們就會(huì)執(zhí)行。以下示例顯示了基本語(yǔ)法: 它定義一個(gè) password 變量并向其附加一個(gè)替換觸發(fā)器;當(dāng)密碼發(fā)生變化時(shí),該觸發(fā)器會(huì)輸出一則消息來(lái)報(bào)告此變量的新值:

          var password = "foo" on replace oldValue {

          println(""nALERT! Password has changed!");

          println("Old Value: {oldValue}");

          println("New Value: {password}");

          };



          password = "bar";
           

          此示例的輸出如下所示:

          ALERT! Password has changed!

          Old Value:

          New Value: foo



          ALERT! Password has changed!

          Old Value: foo

          New Value: bar
           

          此示例中的觸發(fā)器引發(fā)兩次:當(dāng) password 初始化為 "foo" 時(shí)引發(fā)一次,當(dāng)其值變成 "bar" 時(shí)又引發(fā)一次。請(qǐng)注意,oldValue 變量存儲(chǔ)在調(diào)用觸發(fā)器之前變量的值。您可以將 oldValue 變量命名為任何所需的名稱,我們是由于該名稱具有描述性才恰好使用它。



          天蒼蒼,野茫茫,風(fēng)吹草底見(jiàn)牛羊

          posts - 80, comments - 24, trackbacks - 0, articles - 32

          Copyright © asdtiang

          asdtiang的博客 PaidMailz
          點(diǎn)擊廣告網(wǎng)賺A(每天4個(gè)廣告,每個(gè)0.0025美元,一個(gè)搜索廣告0.03美元)
          主站蜘蛛池模板: 镇宁| 建瓯市| 武安市| 扶余县| 双柏县| 石楼县| 浦江县| 库车县| 平远县| 德保县| 建德市| 库伦旗| 渝北区| 巨鹿县| 大荔县| 漳浦县| 股票| 荔浦县| 翼城县| 赤水市| 临漳县| 阿鲁科尔沁旗| 凤阳县| 揭西县| 那曲县| 深水埗区| 南丹县| 桂平市| 旺苍县| 天门市| 上思县| 武城县| 霍城县| 民勤县| 宣武区| 白玉县| 镇平县| 浦县| 铜陵市| 南昌县| 彩票|