本篇內(nèi)容介紹了“如何在Scala中檢查先決條件、添加字段和自指向”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)專注于米易網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供米易營銷型網(wǎng)站建設(shè),米易網(wǎng)站制作、米易網(wǎng)頁設(shè)計、米易網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造米易網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供米易網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
目前主構(gòu)造器會接受把零傳遞給d:
scala> new Rational(5, 0) res6: Rational = 5/0
面向?qū)ο缶幊痰囊粋€優(yōu)點就是它允許你把數(shù)據(jù)封裝在對象之內(nèi)以便于你確保數(shù)據(jù)在整個生命周期中是有效的。像Rational這樣的不可變對象,這就意味著你必須確保在對象創(chuàng)建的時候數(shù)據(jù)是有效的(并且,確保對象的確是不可變的,這樣數(shù)據(jù)就不會在之后變成無效的狀態(tài))。由于零做分母對Rational來說是無效狀態(tài),因此在把零傳遞給d的時候,務(wù)必不能讓Rational被構(gòu)建出來。
解決這個問題的***辦法是為主構(gòu)造器定義一個先決條件:precondition說明d必須為非零值。先決條件是對傳遞給方法或構(gòu)造器的值的限制,是調(diào)用者必須滿足的需求。一種方式是使用require方法,require方法定義在scala包里的孤立對象Predef上。如:
class Rational(n: Int, d: Int) { require(d != 0) override def toString = n +"/"+ d }
require方法帶一個布爾型參數(shù)。如果傳入的值為真,require將正常返回。反之,require將通過拋出IllegalArgumentException來阻止對象被構(gòu)造。
添加字段
現(xiàn)在主構(gòu)造器可以正確地執(zhí)行先決條件,我們將把注意力集中到支持加法。想做到這點,我們將在類Rational上定義一個公開的add方法,它帶另一個Rational做參數(shù)。為了保持Rational不可變,add方法必須不能把傳入的分?jǐn)?shù)加到自己身上。而是必須創(chuàng)建并返回一個全新的帶有累加值的Rational。你或許想你可以這么寫add:
class Rational(n: Int, d: Int) { // 編譯不過 require(d != 0) override def toString = n +"/"+ d def add(that: Rational): Rational = new Rational(n * that.d + that.n * d, d * that.d) }
很不幸,上面的代碼會讓編譯器提示說:
< console>:11: error: value d is not a member of Rational new Rational(n * that.d + that.n * d, d * that.d) ? < console>:11: error: value d is not a member of Rational new Rational(n * that.d + that.n * d, d * that.d) ?
盡管類參數(shù)n和d都在你的add代碼可引用的范圍內(nèi),但是在調(diào)用add的對象中僅能訪問它們的值。因此,當(dāng)你在add的實現(xiàn)里講n或d的時候,編譯器將很高興地提供給你這些類參數(shù)的值。但絕對不會讓你使用that.n或that.d,因為that并不指向add被調(diào)用的Rational對象。實際上,在that指的是調(diào)用add的對象時, Rational可以加到自己身上。但是因為你可以傳遞任何Rational對象給add,所以編譯器仍然不會讓你說that.n。要想訪問that的n和d,需要把它們放在字段中。代碼6.1展示了如何把這些字段加入類Rational。
在代碼6.1展示的Rational版本里,我們增加了兩個字段,分別是numer和denom,并用類參數(shù)n和d初始化它們。盡管n和d是用在類的函數(shù)體內(nèi),因為他們只是用在構(gòu)造器之內(nèi),Scala編譯器將不會為它們自動構(gòu)造域。所以就這些代碼來說,Scala編譯器將產(chǎn)生一個有兩個Int域的類,一個是numer,另一個是denom。我們還改變了toString和add的實現(xiàn),讓它們使用字段,而不是類參數(shù)。類Rational的這個版本能夠編譯通過,可以通過分?jǐn)?shù)的加法測試它:
class Rational(n: Int, d: Int) { require(d != 0) val numer: Int = n val denom: Int = d override def toString = numer+"/"+denom def add(that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom ) }
代碼 6.1 帶字段的Rational
scala> val oneHalf = new Rational(1, 2) oneHalf: Rational = 1/2 scala> val twoThirds = new Rational(2, 3) twoThirds: Rational = 2/3 scala> oneHalf add twoThirds res0: Rational = 7/6
另一件之前不能而現(xiàn)在可以做的事是在對象外面訪問分子和分母。只要訪問公共的numer和denom字段即可:
scala> val r = new Rational(1, 2) r: Rational = 1 / 2 scala> r.numer res7: Int = 1 scala> r.denom res8: Int = 2
自指向
關(guān)鍵字this指向當(dāng)前執(zhí)行方法被調(diào)用的對象實例,或者如果使用在構(gòu)造器里的話,就是正被構(gòu)建的對象實例。例如,我們考慮添加一個方法,lessThan,來測試給定的分?jǐn)?shù)是否小于傳入的參數(shù):
def lessThan(that: Rational) = this.numer * that.denom < that.numer * this.denom
這里,this.numer指向lessThan被調(diào)用的那個對象的分子。你也可以去掉this前綴而只是寫numer;著兩種寫法是相同的。
舉一個不能缺少this的例子,考慮在Rational類里添加max方法返回指定分?jǐn)?shù)和參數(shù)中的較大者:
def max(that: Rational) = if (this.lessThan(that)) that else this
這里,***個this是冗余的,你寫成(lessThan(that))也是一樣的。但第二個this表示了當(dāng)測試為假的時候的方法的結(jié)果;如果你省略它,就什么都返回不了了。
“如何在Scala中檢查先決條件、添加字段和自指向”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!