日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
在Scala中檢查先決條件、添加字段和自指向

學(xué)習(xí)Scala中Rational類的下一步是,我們將把視線轉(zhuǎn)向當(dāng)前主構(gòu)造器行為里的一些問題。如本章早些時(shí)候提到的,分?jǐn)?shù)的分母不能為零。然而目前主構(gòu)造器會(huì)接受把零傳遞給d:

編輯推薦:Scala編程語言專題

 
 
 
  1. scala> new Rational(5, 0)  
  2. res6: Rational = 5/0 

面向?qū)ο缶幊痰囊粋€(gè)優(yōu)點(diǎn)就是它允許你把數(shù)據(jù)封裝在對(duì)象之內(nèi)以便于你確保數(shù)據(jù)在整個(gè)生命周期中是有效的。像Rational這樣的不可變對(duì)象,這就意味著你必須確保在對(duì)象創(chuàng)建的時(shí)候數(shù)據(jù)是有效的(并且,確保對(duì)象的確是不可變的,這樣數(shù)據(jù)就不會(huì)在之后變成無效的狀態(tài))。由于零做分母對(duì)Rational來說是無效狀態(tài),因此在把零傳遞給d的時(shí)候,務(wù)必不能讓Rational被構(gòu)建出來。

解決這個(gè)問題的***辦法是為主構(gòu)造器定義一個(gè)先決條件:precondition說明d必須為非零值。先決條件是對(duì)傳遞給方法或構(gòu)造器的值的限制,是調(diào)用者必須滿足的需求。一種方式是使用require方法,require方法定義在scala包里的孤立對(duì)象Predef上。如:

 
 
 
  1. class Rational(n: Int, d: Int) {  
  2.  require(d != 0)  
  3.  override def toString = n +"/"+ d  
  4. }  

require方法帶一個(gè)布爾型參數(shù)。如果傳入的值為真,require將正常返回。反之,require將通過拋出IllegalArgumentException來阻止對(duì)象被構(gòu)造。

添加字段

現(xiàn)在主構(gòu)造器可以正確地執(zhí)行先決條件,我們將把注意力集中到支持加法。想做到這點(diǎn),我們將在類Rational上定義一個(gè)公開的add方法,它帶另一個(gè)Rational做參數(shù)。為了保持Rational不可變,add方法必須不能把傳入的分?jǐn)?shù)加到自己身上。而是必須創(chuàng)建并返回一個(gè)全新的帶有累加值的Rational。你或許想你可以這么寫add:

 
 
 
  1. class Rational(n: Int, d: Int) { // 編譯不過  
  2.  require(d != 0)  
  3.  override def toString = n +"/"+ d  
  4.  def add(that: Rational): Rational =  
  5.   new Rational(n * that.d + that.n * d, d * that.d)  
  6. }  

很不幸,上面的代碼會(huì)讓編譯器提示說:

 
 
 
  1. < console>:11: error: value d is not a member of Rational  
  2.       new Rational(n * that.d + that.n * d, d * that.d)  
  3.                                        ?  
  4. < console>:11: error: value d is not a member of Rational  
  5.       new Rational(n * that.d + that.n * d, d * that.d)  
  6.                                                                      ?  

盡管類參數(shù)n和d都在你的add代碼可引用的范圍內(nèi),但是在調(diào)用add的對(duì)象中僅能訪問它們的值。因此,當(dāng)你在add的實(shí)現(xiàn)里講n或d的時(shí)候,編譯器將很高興地提供給你這些類參數(shù)的值。但絕對(duì)不會(huì)讓你使用that.n或that.d,因?yàn)閠hat并不指向add被調(diào)用的Rational對(duì)象。實(shí)際上,在that指的是調(diào)用add的對(duì)象時(shí), Rational可以加到自己身上。但是因?yàn)槟憧梢詡鬟f任何Rational對(duì)象給add,所以編譯器仍然不會(huì)讓你說that.n。要想訪問that的n和d,需要把它們放在字段中。代碼6.1展示了如何把這些字段加入類Rational。

在代碼6.1展示的Rational版本里,我們?cè)黾恿藘蓚€(gè)字段,分別是numer和denom,并用類參數(shù)n和d初始化它們。盡管n和d是用在類的函數(shù)體內(nèi),因?yàn)樗麄冎皇怯迷跇?gòu)造器之內(nèi),Scala編譯器將不會(huì)為它們自動(dòng)構(gòu)造域。所以就這些代碼來說,Scala編譯器將產(chǎn)生一個(gè)有兩個(gè)Int域的類,一個(gè)是numer,另一個(gè)是denom。我們還改變了toString和add的實(shí)現(xiàn),讓它們使用字段,而不是類參數(shù)。類Rational的這個(gè)版本能夠編譯通過,可以通過分?jǐn)?shù)的加法測(cè)試它:

 
 
 
  1. class Rational(n: Int, d: Int) {  
  2.   require(d != 0)  
  3.   val numer: Int = n  
  4.   val denom: Int = d  
  5.   override def toString = numer+"/"+denom  
  6.   def add(that: Rational): Rational =  
  7.     new Rational(  
  8.       numer * that.denom + that.numer * denom,  
  9.       denom * that.denom  
  10.     )  
  11. }  

代碼 6.1 帶字段的Rational

 
 
 
  1. scala> val oneHalf = new Rational(1, 2)  
  2. oneHalf: Rational = 1/2 
  3. scala> val twoThirds = new Rational(2, 3)  
  4. twoThirds: Rational = 2/3 
  5. scala> oneHalf add twoThirds  
  6. res0: Rational = 7/6 

另一件之前不能而現(xiàn)在可以做的事是在對(duì)象外面訪問分子和分母。只要訪問公共的numer和denom字段即可:

 
 
 
  1. scala> val r = new Rational(1, 2)  
  2. r: Rational = 1 / 2 
  3. scala> r.numer  
  4. res7: Int = 1 
  5. scala> r.denom  
  6. res8: Int = 2 

自指向

關(guān)鍵字this指向當(dāng)前執(zhí)行方法被調(diào)用的對(duì)象實(shí)例,或者如果使用在構(gòu)造器里的話,就是正被構(gòu)建的對(duì)象實(shí)例。例如,我們考慮添加一個(gè)方法,lessThan,來測(cè)試給定的分?jǐn)?shù)是否小于傳入的參數(shù):

 
 
 
  1. def lessThan(that: Rational) =  
  2.   this.numer * that.denom <  that.numer * this.denom  

這里,this.numer指向lessThan被調(diào)用的那個(gè)對(duì)象的分子。你也可以去掉this前綴而只是寫numer;著兩種寫法是相同的。

舉一個(gè)不能缺少this的例子,考慮在Rational類里添加max方法返回指定分?jǐn)?shù)和參數(shù)中的較大者:

 
 
 
  1. def max(that: Rational) =  
  2.  if (this.lessThan(that)) that else this 

這里,***個(gè)this是冗余的,你寫成(lessThan(that))也是一樣的。但第二個(gè)this表示了當(dāng)測(cè)試為假的時(shí)候的方法的結(jié)果;如果你省略它,就什么都返回不了了。

【相關(guān)閱讀】

  1. Scala Rational對(duì)象的toString方法
  2. 學(xué)習(xí)Scala中的Rational類:分?jǐn)?shù)的模型化
  3. Scala中的富包裝器:富操作和富類列表
  4. Scala操作符的優(yōu)先級(jí)和關(guān)聯(lián)性
  5. Scala對(duì)象的相等性比較

分享名稱:在Scala中檢查先決條件、添加字段和自指向
分享地址:http://m.5511xx.com/article/cdjjcps.html