成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Scala中檢查先決條件、添加字段和自指向

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第六章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

學習Scala中Rational類的下一步是,我們將把視線轉向當前主構造器行為里的一些問題。如本章早些時候提到的,分數的分母不能為零。然而目前主構造器會接受把零傳遞給d:

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

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

面向對象編程的一個優點就是它允許你把數據封裝在對象之內以便于你確保數據在整個生命周期中是有效的。像Rational這樣的不可變對象,這就意味著你必須確保在對象創建的時候數據是有效的(并且,確保對象的確是不可變的,這樣數據就不會在之后變成無效的狀態)。由于零做分母對Rational來說是無效狀態,因此在把零傳遞給d的時候,務必不能讓Rational被構建出來。

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

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

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

添加字段

現在主構造器可以正確地執行先決條件,我們將把注意力集中到支持加法。想做到這點,我們將在類Rational上定義一個公開的add方法,它帶另一個Rational做參數。為了保持Rational不可變,add方法必須不能把傳入的分數加到自己身上。而是必須創建并返回一個全新的帶有累加值的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. }  

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

  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.                                                                      ˆ  

盡管類參數n和d都在你的add代碼可引用的范圍內,但是在調用add的對象中僅能訪問它們的值。因此,當你在add的實現里講n或d的時候,編譯器將很高興地提供給你這些類參數的值。但絕對不會讓你使用that.n或that.d,因為that并不指向add被調用的Rational對象。實際上,在that指的是調用add的對象時, Rational可以加到自己身上。但是因為你可以傳遞任何Rational對象給add,所以編譯器仍然不會讓你說that.n。要想訪問that的n和d,需要把它們放在字段中。代碼6.1展示了如何把這些字段加入類Rational。

在代碼6.1展示的Rational版本里,我們增加了兩個字段,分別是numer和denom,并用類參數n和d初始化它們。盡管n和d是用在類的函數體內,因為他們只是用在構造器之內,Scala編譯器將不會為它們自動構造域。所以就這些代碼來說,Scala編譯器將產生一個有兩個Int域的類,一個是numer,另一個是denom。我們還改變了toString和add的實現,讓它們使用字段,而不是類參數。類Rational的這個版本能夠編譯通過,可以通過分數的加法測試它:

  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(12)  
  2. oneHalf: Rational = 1/2 
  3. scala> val twoThirds = new Rational(23)  
  4. twoThirds: Rational = 2/3 
  5. scala> oneHalf add twoThirds  
  6. res0: Rational = 7/6 

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

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

自指向

關鍵字this指向當前執行方法被調用的對象實例,或者如果使用在構造器里的話,就是正被構建的對象實例。例如,我們考慮添加一個方法,lessThan,來測試給定的分數是否小于傳入的參數:

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

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

舉一個不能缺少this的例子,考慮在Rational類里添加max方法返回指定分數和參數中的較大者:

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

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

【相關閱讀】

  1. Scala Rational對象的toString方法
  2. 學習Scala中的Rational類:分數的模型化
  3. Scala中的富包裝器:富操作和富類列表
  4. Scala操作符的優先級和關聯性
  5. Scala對象的相等性比較
責任編輯:book05 來源: Artima
相關推薦

2010-12-21 13:54:14

Exchange 20

2021-10-18 09:43:57

數字化轉型企業技術服務

2009-09-09 11:37:08

Scala的模式匹配

2009-07-22 08:34:47

Scala方法和字段

2010-11-22 11:38:08

MySQL添加字段

2009-07-22 08:57:49

Scalafinal

2009-07-20 16:56:51

Scala類的定義

2009-07-22 07:53:00

Scala無參數方法

2009-07-21 12:47:04

Scala私有字段定義操作符

2010-03-10 10:39:37

光口交換機

2010-11-23 15:27:00

MySQL添加字段

2020-09-29 10:52:25

代碼開發谷歌

2022-01-24 16:55:09

LinuxTCP工具

2023-10-11 17:58:22

2024-05-06 00:00:00

GAC代碼緩存

2021-02-21 10:14:59

數據中心人工智能

2021-03-27 10:51:21

SaaS安全配置管理SSPM)攻擊

2009-11-16 17:04:46

Inside Scal

2013-05-03 14:26:09

騰訊云云計算騰訊

2010-05-31 11:34:00

MySQL自增字段
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美男人天堂 | 欧洲精品在线观看 | 久久精品免费观看 | avtt国产 | 欧美亚洲国产一区 | 精品久久久久久亚洲精品 | 精品久久不卡 | 欧美精品在线播放 | 中文字幕一区二区三区乱码在线 | 国产精品美女久久久久久免费 | 午夜爽爽男女免费观看hd | 999精品视频 | 亚洲一本 | 欧美成人自拍 | 久草在线在线精品观看 | 亚洲一区二区三区在线视频 | h漫在线观看 | 妖精视频一区二区三区 | 亚洲 欧美 日韩在线 | 欧美综合国产精品久久丁香 | 国产有码 | 国产成人一区二区 | 亚洲精品美女 | 色999视频| 国产精品视频免费看 | 亚洲欧美在线视频 | 91偷拍精品一区二区三区 | 亚洲精品无 | 精品久久久久久久久久久院品网 | 久久久久久国产精品免费免费 | 草草在线观看 | 99riav国产一区二区三区 | 久久爱黑人激情av摘花 | 亚洲 中文 欧美 日韩 在线观看 | 欧美一区二区三区在线观看视频 | 亚洲国产成人精品久久 | 中文字幕在线观看成人 | 国产欧美日韩综合精品一区二区 | 午夜成人免费视频 | 中文字幕av亚洲精品一部二部 | 亚洲国产成人精品在线 |