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

Scala的私有字段和定義操作符

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

私有字段和方法

上一個版本的Rational類里,我們只是分別用n初始化了numer,用d初始化了denom。結果,Rational的分子和分母可能比它所需要的要大。例如分數66/42 ,可以更約簡化為相同的最簡形式,11/7 ,但Rational的主構造器當前并不做這個工作:

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

  1. scala> new Rational(6642)  
  2. res15: Rational = 66/42 
要想對分數進行約簡化,需要把分子和分母都除以***公約數:greatest common divisor。如:66和42的***公約數是6。(另一種說法就是,6是能夠除盡66和42的***的整數。)66/42 的分子和分母都除以6就產生它的最簡形式,11/7 。代碼6.3展示了如何做到這點:

  1. class Rational(n: Int, d: Int) {  
  2.  require(d != 0)  
  3.  private val g = gcd(n.abs, d.abs)  
  4.  val numer = n / g  
  5.  val denom = d / g  
  6.  def this(n: Int) = this(n, 1)  
  7.  def add(that: Rational): Rational =  
  8.   new Rational(  
  9.    numer * that.denom + that.numer * denom,  
  10.    denom * that.denom  
  11.   )  
  12.  override def toString = numer+"/"+denom  
  13.  private def gcd(a: Int, b: Int): Int =  
  14.   if (b == 0) a else gcd(b, a % b)  
  15. }  
代碼 6.3 帶私有字段和方法的Rational

這個版本的Rational里,我們添加了私有字段,g,并修改了numer和denom的初始化器(初始化器:initializer是初始化變量,例如初始化numer的“n / g”,的代碼)。因為g是私有的,它只能在類的主體之內,而不能在外部被訪問。我們還添加了一個私有方法,gcd,用來計算傳入的兩個Int的***公約數。比方說,gcd(12, 8)是4。正如你在4.1節中看到的,想讓一個字段或方法私有化你只要把private關鍵字放在定義的前面。私有的“助手方法”gcd的目的是把類的其它部分,這里是主構造器,需要的代碼分離出來。為了確保g始終是正的,我們傳入n和d的絕對值,調用abs即可獲得任意整數的絕對值。

Scala編譯器將把Rational的三個字段的初始化代碼依照它們在源代碼中出現的次序放入主構造器。所以g的初始化代碼,gcd(n.abs, d.abs),將在另外兩個之前執行,因為它在源文件中出現得最早。g將被初始化為類參數,n和d,的絕對值的***公約數。然后再被用于numer和denom的初始化。通過把n和d整除它們的***公約數,g,每個Rational都將被構造成它的最簡形式:

  1. scala> new Rational(6642)  
  2. res24: Rational = 11/7 
定義操作符

Rational加法的當前實現僅就完成功能來講是沒問題的,但它可以做得更好用。你或許會問你自己為什么對于整數或浮點數你可以寫成:

  1. x + y 
但是如果是分數就必須寫成:

  1. x.add(y) 
或至少是:

  1. x add y 
沒有合理的解釋為什么就必須是這樣的。分數和別的數應該是一樣的。數學的角度上看他們甚至比,唔,浮點數,更自然。為什么就不能使用自然的數學操作符呢?Scala里面你做得到。本章后續部分,我們會告訴你怎么做。

***步是用通常的數學的符號替換add方法。這可以直接做到,因為Scala里+是合法的標識符。我們可以用+定義方法名。既然已經到這兒了,你可以同樣實現一個*方法以實現乘法,結果展示在代碼6.4中:

  1. class Rational(n: Int, d: Int) {  
  2.  require(d != 0)  
  3.  private val g = gcd(n.abs, d.abs)  
  4.  val numer = n / g  
  5.  val denom = d / g  
  6.  def this(n: Int) = this(n, 1)  
  7.  def +(that: Rational): Rational =  
  8.   new Rational(  
  9.    numer * that.denom + that.numer * denom,  
  10.    denom * that.denom  
  11.   )  
  12.  def *(that: Rational): Rational =  
  13.   new Rational(numer * that.numer, denom * that.denom)  
  14.  override def toString = numer+"/"+denom  
  15.  private def gcd(a: Int, b: Int): Int =  
  16.   if (b == 0) a else gcd(b, a % b)  
  17. }  
代碼 6.4 帶操作符方法的Rational

有了這種方式定義的Rational類,你現在可以這么寫了:

  1. scala> val x = new Rational(12)  
  2. x: Rational = 1/2 
  3. scala> val y = new Rational(23)  
  4. y: Rational = 2/3 
  5. scala> x + y  
  6. res32: Rational = 7/6 
與以往一樣,在***輸入的那行里的語法格式相等于一個方法調用。你也能這么寫:

  1. scala> x.+(y)  
  2. res33: Rational = 7/6 
不過這樣寫可讀性不佳。

另外一件要提的是基于5.8節中提到的Scala的操作符優先級規則,Rational里面的*方法要比+方法綁定得更結實。或者說,Rational涉及到+和*操作的表達式會按照預期的方式那樣表現。例如,x + x * y會當作x + (x * y)而不是(x + x) * y:

  1. scala> x + x * y  
  2. res34: Rational = 5/6 
  3. scala> (x + x) * y  
  4. res35: Rational = 2/3 
  5. scala> x + (x * y)  
  6. res36: Rational = 5/6 

【相關閱讀】

  1. Scala的從構造器:主構造器之外的構造器
  2. 在Scala中檢查先決條件、添加字段和自指向
  3. Scala Rational對象的toString方法
  4. 學習Scala中的Rational類:分數的模型化
  5. Scala中的富包裝器:富操作和富類列表
責任編輯:book05 來源: Artima
相關推薦

2009-07-21 09:31:00

Scala操作符

2009-07-21 08:41:05

Scala操作符優先級

2009-07-21 09:31:00

Scala數學運算邏輯操作位操作符

2009-12-11 10:43:00

Scala講座操作符函數

2010-07-14 14:55:07

Perl操作符

2009-07-20 16:56:51

Scala類的定義

2021-10-31 18:59:55

Python操作符用法

2009-08-19 17:26:28

C# 操作符

2021-07-01 11:07:49

Swift 自定義操作符

2009-07-14 18:34:22

Jython操作符重載

2010-07-13 11:11:39

Perl標量

2009-11-30 16:48:08

PHP操作符

2024-01-07 20:15:49

Python編程語言

2009-08-21 09:30:05

is和as操作符

2009-07-22 08:34:47

Scala方法和字段

2011-04-08 16:26:14

JavaScript

2010-07-14 14:30:31

Perl操作符

2010-07-19 11:00:24

Perl操作符

2009-09-15 17:16:58

LINQ查詢操作符

2012-02-06 09:13:23

LINQ
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区免费视频 | 欧美综合久久 | 亚洲在线一区二区三区 | 久久最新精品 | 天天干夜夜操 | 国产超碰人人爽人人做人人爱 | www.jizzjizz| 在线视频日韩 | 国产精品亚洲综合 | yiren22 亚洲综合 | 国产一区二区三区四区 | 日韩视频在线一区 | 黄色网址在线播放 | 日韩一区二区在线看 | 日本不卡视频在线播放 | 91精品欧美久久久久久久 | 午夜精品一区二区三区在线播放 | se婷婷| 成人影院一区二区三区 | 欧美九九九 | 青青久在线视频 | 毛片区| 毛片a区 | 中文在线播放 | 91精品久久久久久久久中文字幕 | 久久性色| 欧美www在线观看 | 日本三级线观看 视频 | 91影视 | 国产成人免费视频 | 亚洲午夜精品一区二区三区他趣 | 免费视频中文字幕 | 国产视频久久 | 欧美亚洲综合久久 | 亚洲精品456| 国产欧美一区二区久久性色99 | 81精品国产乱码久久久久久 | 色资源av| 免费成人av网站 | 亚洲综合在线一区二区 | 亚洲男人天堂av |