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

學(xué)習(xí)Scala的重載方法和隱式轉(zhuǎn)換

開(kāi)發(fā) 后端
本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第六章。Scala是一種針對(duì) JVM 將函數(shù)和面向?qū)ο蠹夹g(shù)組合在一起的編程語(yǔ)言。

方法重載

回到Rational類(lèi)上來(lái)。在最近一次改變之后,你可以在分?jǐn)?shù)上用自然的風(fēng)格做加法和乘法。但別忘了還有混合運(yùn)算。例如,你不能把一個(gè)分?jǐn)?shù)和一個(gè)整數(shù)乘在一起,因?yàn)椤?’的操作數(shù)只能是分?jǐn)?shù)。所以對(duì)于分?jǐn)?shù)r你不能寫(xiě)r * 2。而必須寫(xiě)成r * new Rational(2),看上去不漂亮。為了讓Rational用起來(lái)更方便,可以在類(lèi)上增加能夠執(zhí)行分?jǐn)?shù)和整數(shù)之間的加法和乘法的新方法。既然已經(jīng)到這里了,還可以再加上減法和除法。結(jié)果展示在代碼6.5中:

51CTO編輯推薦:Scala編程語(yǔ)言專(zhuān)題

  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 +(i: Int): Rational =  
  13.   new Rational(numer + i * denom, denom)  
  14.  def -(that: Rational): Rational =  
  15.   new Rational(  
  16.    numer * that.denom - that.numer * denom,  
  17.    denom * that.denom  
  18.   )  
  19.  def -(i: Int): Rational =  
  20.   new Rational(numer - i* denom, denom)  
  21.  def *(that: Rational): Rational =  
  22.   new Rational(numer * that.numer, denom * that.denom)  
  23.  def *(i: Int): Rational =  
  24.   new Rational(numer * i, denom)  
  25.  def /(that: Rational): Rational =  
  26.   new Rational(numer * that.denom, denom * that.numer)  
  27.  def /(i: Int): Rational =  
  28.   new Rational(numer, denom * i)  
  29.  override def toString = numer+"/"+denom  
  30.  private def gcd(a: Int, b: Int): Int =  
  31.   if (b == 0) a else gcd(b, a % b)  
  32. }  
代碼 6.5 含有重載方法的Rational

現(xiàn)在每種數(shù)學(xué)方法都有兩個(gè)版本了:一個(gè)帶分?jǐn)?shù)做參數(shù),另一個(gè)帶整數(shù)。或者可以說(shuō),這些方法名都被重載:overload了,因?yàn)槊總€(gè)名字現(xiàn)在都被多個(gè)方法使用。例如,+這個(gè)名字被一個(gè)帶Rational的和另一個(gè)帶Int的方法使用。方法調(diào)用里,編譯器會(huì)揀出正確地匹配了參數(shù)類(lèi)型的重載方法版本。例如,如果x.+(y)的參數(shù)y是Rational,編譯器就會(huì)揀帶有Rational參數(shù)的+方法來(lái)用。相反如果參數(shù)是整數(shù),編譯器就會(huì)揀帶有Int參數(shù)的+方法做替代。如果你嘗試輸入:

  1. scala> val x = new Rational(23)  
  2. x: Rational = 2/3 
  3. scala> x * x  
  4. res37: Rational = 4/9 
  5. scala> x * 2 
  6. res38: Rational = 4/3 

你會(huì)看到*方法的調(diào)用取決于每個(gè)例子里面右側(cè)操作數(shù)的類(lèi)型。

注意

Scala分辨重載方法的過(guò)程與Java極為相似。任何情況下,被選中的重載版本都是***參數(shù)靜態(tài)類(lèi)型的那個(gè)。有時(shí)如果不止一個(gè)***的版本;這種情況下編譯器會(huì)給你一個(gè)“參考模糊”的錯(cuò)誤。

隱式轉(zhuǎn)換

現(xiàn)在你能寫(xiě)r * 2了,或許你想交換操作數(shù),就像2 * r這樣。不幸的是這樣做還不可以:

  1. scala> 2 * r  
  2. < console>:7: error: overloaded method value * with alternatives  
  3. (Double)Double < and> (Float)Float < and> (Long)Long < and> (Int)Int  
  4. < and> (Char)Int < and> (Short)Int < and> (Byte)Int cannot be  
  5. applied to (Rational)  
  6.   val res2 = 2 * r  
  7.                  ˆ  
這里的問(wèn)題是2 * r等同于2.*(r),因此這是在整數(shù)2上的方法調(diào)用。但I(xiàn)nt類(lèi)沒(méi)有帶Rational參數(shù)的乘法——沒(méi)辦法,因?yàn)轭?lèi)Rational不是Scala庫(kù)的標(biāo)準(zhǔn)類(lèi)。

然而,Scala里有另外一種方法解決這個(gè)問(wèn)題:你可以創(chuàng)建一個(gè)在需要的時(shí)候能自動(dòng)把整數(shù)轉(zhuǎn)換為分?jǐn)?shù)的隱式轉(zhuǎn)換。試著把這行代碼加入到解釋器:

  1. scala> implicit def intToRational(x: Int) = new Rational(x)  
這行代碼定義了從Int到Rational的轉(zhuǎn)換方法。方法前面的implicit修飾符告訴編譯器若干情況下自動(dòng)調(diào)用它。定義了轉(zhuǎn)換之后,你現(xiàn)在可以重試之前失敗的例子了:

  1. scala> val r = new Rational(2,3)  
  2. r: Rational = 2/3 
  3. scala> 2 * r  
  4. res0: Rational = 4/3 
請(qǐng)注意隱式轉(zhuǎn)換要起作用,需要定義在作用范圍之內(nèi)。如果你把隱式方法定義放在類(lèi)Rational之內(nèi),它就不在解釋器的作用范圍。現(xiàn)在,你要在解釋器內(nèi)直接定義它。

正如你在這個(gè)例子中能領(lǐng)略到的,隱式轉(zhuǎn)換是把庫(kù)變得更靈活和更方便的非常強(qiáng)大的技術(shù)。因?yàn)樗麄內(nèi)绱藦?qiáng)大,所以也很容易被誤用。第二十一章里你將發(fā)現(xiàn)隱式轉(zhuǎn)換的更多細(xì)節(jié),包括在需要的時(shí)候把它們帶入作用范圍的方式。

【相關(guān)閱讀】

  1. Scala的四種標(biāo)識(shí)符構(gòu)成方式
  2. Scala的私有字段和定義操作符
  3. Scala的從構(gòu)造器:主構(gòu)造器之外的構(gòu)造器
  4. 在Scala中檢查先決條件、添加字段和自指向
  5. Scala Rational對(duì)象的toString方法

責(zé)任編輯:book05 來(lái)源: Artima
相關(guān)推薦

2009-09-04 10:49:19

C#隱式轉(zhuǎn)換

2009-07-22 08:34:47

Scala方法和字段

2009-07-20 16:56:51

Scala類(lèi)的定義

2023-12-12 08:50:22

MySQL隱式轉(zhuǎn)換varchar

2022-02-23 21:24:21

索引SQL字符

2009-08-27 10:06:15

Scala的構(gòu)造方法

2023-08-14 08:35:36

2010-02-04 16:47:04

C++隱式轉(zhuǎn)換

2017-12-20 14:14:16

數(shù)據(jù)庫(kù)MySQL數(shù)據(jù)類(lèi)型

2023-09-22 09:04:00

C++編程

2009-08-05 14:09:04

C#日期轉(zhuǎn)換

2009-07-21 17:26:09

Scala本地函數(shù)

2010-11-16 15:11:52

Oracle隱式游標(biāo)

2023-04-27 09:08:19

JavaScript隱式類(lèi)型轉(zhuǎn)換

2021-12-01 06:03:24

JS TrueJavaScript

2017-09-13 10:58:51

JavaScript轉(zhuǎn)換規(guī)則

2017-09-05 16:17:35

JavaScript運(yùn)算轉(zhuǎn)換

2009-07-08 16:10:24

Scala簡(jiǎn)介面向?qū)ο?/a>函數(shù)式

2009-09-27 15:29:00

Scala講座面向?qū)ο?/a>Scala

2009-07-21 16:58:31

Scala變量范圍
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美黄色大片在线观看 | 国产va| 国产精品久久久久久久久久三级 | 亚洲日日夜夜 | 免费在线播放黄色 | 精品国产乱码一区二区三区 | 国产美女一区二区 | 成人精品国产免费网站 | 国产成人免费网站 | 一区二区成人 | 欧美一区精品 | 一区二区欧美在线 | 亚洲成人免费观看 | 亚洲午夜精品一区二区三区他趣 | 中文精品久久 | 黄色a三级 | 日本亚洲精品成人欧美一区 | 欧美激情一区二区三区 | 国产一级视频免费播放 | 五月槐花香| 成人在线免费观看 | 午夜精品久久久久久久久久久久久 | 国产一在线观看 | 欧美在线一区二区三区 | 成人aaa视频 | 久久久久久九九九九 | 精品中文字幕久久 | 国产欧美一区二区在线观看 | 国产aⅴ精品 | 国产精品性做久久久久久 | 91精品国产91久久综合桃花 | 男女爱爱网站 | 精品日韩一区二区三区av动图 | 一级黄色片在线看 | 日本淫视频 | av激情在线| 国产精品激情小视频 | xxxxx免费视频| 精品国产18久久久久久二百 | 日韩在线视频观看 | 欧美日韩在线一区二区三区 |