您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Scala中如何使用私有字段,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
私有字段和方法
上一個版本的Rational類里,我們只是分別用n初始化了numer,用d初始化了denom。結果,Rational的分子和分母可能比它所需要的要大。例如分數 ,可以更約簡化為相同的最簡形式, ,但Rational的主構造器當前并不做這個工作:
51CTO編輯推薦:Scala編程語言專題
scala> new Rational(66, 42) res15: Rational = 66/42
要想對分數進行約簡化,需要把分子和分母都除以***公約數:greatest common divisor。如:66和42的***公約數是6。(另一種說法就是,6是能夠除盡66和42的***的整數。) 的分子和分母都除以6就產生它的最簡形式, 。代碼6.3展示了如何做到這點:
class Rational(n: Int, d: Int) { require(d != 0) private val g = gcd(n.abs, d.abs) val numer = n / g val denom = d / g def this(n: Int) = this(n, 1) def add(that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom ) override def toString = numer+"/"+denom private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) }
代碼 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都將被構造成它的最簡形式:
scala> new Rational(66, 42) res24: Rational = 11/7
定義操作符
undefined
x + y
但是如果是分數就必須寫成:
x.add(y)
或至少是:
x add y
沒有合理的解釋為什么就必須是這樣的。分數和別的數應該是一樣的。數學的角度上看他們甚至比,唔,浮點數,更自然。為什么就不能使用自然的數學操作符呢?Scala里面你做得到。本章后續部分,我們會告訴你怎么做。
***步是用通常的數學的符號替換add方法。這可以直接做到,因為Scala里+是合法的標識符。我們可以用+定義方法名。既然已經到這兒了,你可以同樣實現一個*方法以實現乘法,結果展示在代碼6.4中:
class Rational(n: Int, d: Int) { require(d != 0) private val g = gcd(n.abs, d.abs) val numer = n / g val denom = d / g def this(n: Int) = this(n, 1) def +(that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom ) def *(that: Rational): Rational = new Rational(numer * that.numer, denom * that.denom) override def toString = numer+"/"+denom private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) }
代碼 6.4 帶操作符方法的Rational
有了這種方式定義的Rational類,你現在可以這么寫了:
scala> val x = new Rational(1, 2) x: Rational = 1/2 scala> val y = new Rational(2, 3) y: Rational = 2/3 scala> x + y res32: Rational = 7/6
與以往一樣,在***輸入的那行里的語法格式相等于一個方法調用。你也能這么寫:
scala> x.+(y) res33: Rational = 7/6
不過這樣寫可讀性不佳。
另外一件要提的是基于5.8節中提到的Scala的操作符優先級規則,Rational里面的*方法要比+方法綁定得更結實。或者說,Rational涉及到+和*操作的表達式會按照預期的方式那樣表現。例如,x + x * y會當作x + (x * y)而不是(x + x) * y:
scala> x + x * y res34: Rational = 5/6 scala> (x + x) * y res35: Rational = 2/3 scala> x + (x * y) res36: Rational = 5/6
上述就是小編為大家分享的Scala中如何使用私有字段了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。