国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

學習Scala的重載方法和隱式轉換

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

方法重載

回到Rational類上來。在最近一次改變之后,你可以在分數上用自然的風格做加法和乘法。但別忘了還有混合運算。例如,你不能把一個分數和一個整數乘在一起,因為‘*’的操作數只能是分數。所以對于分數r你不能寫r * 2。而必須寫成r * new Rational(2),看上去不漂亮。為了讓Rational用起來更方便,可以在類上增加能夠執行分數和整數之間的加法和乘法的新方法。既然已經到這里了,還可以再加上減法和除法。結果展示在代碼6.5中:

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

  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

現在每種數學方法都有兩個版本了:一個帶分數做參數,另一個帶整數。或者可以說,這些方法名都被重載:overload了,因為每個名字現在都被多個方法使用。例如,+這個名字被一個帶Rational的和另一個帶Int的方法使用。方法調用里,編譯器會揀出正確地匹配了參數類型的重載方法版本。例如,如果x.+(y)的參數y是Rational,編譯器就會揀帶有Rational參數的+方法來用。相反如果參數是整數,編譯器就會揀帶有Int參數的+方法做替代。如果你嘗試輸入:

  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 

你會看到*方法的調用取決于每個例子里面右側操作數的類型。

注意

Scala分辨重載方法的過程與Java極為相似。任何情況下,被選中的重載版本都是***參數靜態類型的那個。有時如果不止一個***的版本;這種情況下編譯器會給你一個“參考模糊”的錯誤。

隱式轉換

現在你能寫r * 2了,或許你想交換操作數,就像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.                  ˆ  
這里的問題是2 * r等同于2.*(r),因此這是在整數2上的方法調用。但Int類沒有帶Rational參數的乘法——沒辦法,因為類Rational不是Scala庫的標準類。

然而,Scala里有另外一種方法解決這個問題:你可以創建一個在需要的時候能自動把整數轉換為分數的隱式轉換。試著把這行代碼加入到解釋器:

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

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

正如你在這個例子中能領略到的,隱式轉換是把庫變得更靈活和更方便的非常強大的技術。因為他們如此強大,所以也很容易被誤用。第二十一章里你將發現隱式轉換的更多細節,包括在需要的時候把它們帶入作用范圍的方式。

【相關閱讀】

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

責任編輯:book05 來源: Artima
相關推薦

2009-09-04 10:49:19

C#隱式轉換

2009-07-22 08:34:47

Scala方法和字段

2009-07-20 16:56:51

Scala類的定義

2023-12-12 08:50:22

MySQL隱式轉換varchar

2022-02-23 21:24:21

索引SQL字符

2009-08-27 10:06:15

Scala的構造方法

2023-08-14 08:35:36

2010-02-04 16:47:04

C++隱式轉換

2017-12-20 14:14:16

數據庫MySQL數據類型

2023-09-22 09:04:00

C++編程

2009-08-05 14:09:04

C#日期轉換

2009-07-21 17:26:09

Scala本地函數

2010-11-16 15:11:52

Oracle隱式游標

2025-10-10 08:04:22

MySQL索引失效隱式類型

2021-12-01 06:03:24

JS TrueJavaScript

2017-09-13 10:58:51

JavaScript轉換規則

2023-04-27 09:08:19

JavaScript隱式類型轉換

2017-09-05 16:17:35

JavaScript運算轉換

2009-07-08 16:10:24

Scala簡介面向對象函數式

2009-09-27 15:29:00

Scala講座面向對象Scala
點贊
收藏

51CTO技術棧公眾號

亚洲欧洲另类国产综合| 1区1区3区4区产品乱码芒果精品| 鲁丝片一区二区三区| 高清国产一区| 黄色亚洲在线| 国产日韩精品在线| 成人在线观看视频app| 国产综合精品一区| 欧美久久久久久蜜桃| 亚洲天堂av在线播放| 水莓100国产免费av在线播放| 国产精品一二三四区| 91高跟黑色丝袜呻吟在线观看| 国产欧美日韩电影| 日韩av一卡二卡| 国产网站在线播放| 亚洲激情综合网| 亚洲欧洲日产国码无码久久99| 欧美在线三级| 成人欧美一区二区三区黑人| 国产高清亚洲| 秋霞av国产精品一区| 最新不卡av| 视频精品一区二区三区| 伊人久久大香线蕉综合网蜜芽| 国产乱码精品一区二区亚洲| 91久久精品一区二区三| 久久99999| 99久久精品免费精品国产| 日韩欧美亚洲日产国| 久久婷婷五月综合色丁香| 欧美日韩福利视频| 亚洲国产精彩中文乱码av| 人妻无码视频一区二区三区| 蜜桃精品视频在线| 国产成人精品亚洲精品| 久久久久久久激情视频| 四虎影视国产在线视频| 色婷婷综合久色| 亚洲综合社区网| 欧洲一区二区三区| 91国产成人在线| 国产资源在线观看入口av| 国产精品亚洲精品| 欧洲中文字幕国产精品| 亚洲十八**毛片| 岛国在线视频网站| 国产激情视频网址| 中文子幕无线码一区tr| 国产精品视频网站| 成人观看网址| 岛国av一区二区| 亚洲一卡二卡区| 国产一区二区三区国产精品| 欧美亚一区二区| 好操啊在线观看免费视频| 国产精品国产福利国产秒拍| 成人在线观看黄| 久久婷婷国产综合精品青草| 91精品国产91久久久久麻豆 主演| 国内精品免费在线观看| 999久久欧美人妻一区二区| 久久免费大视频| www浪潮av99com| 秋霞成人午夜伦在线观看| 成人av资源网| 麻豆精品视频在线观看免费| 日韩av电影免费在线| 国产一区在线视频| 伊人婷婷久久| 亚洲日本韩国一区| 欧美这里只有精品| 日韩av一区二| 中国大陆高清aⅴ毛片| 日韩 欧美 自拍| 日韩网站在线免费观看| 国产精品系列在线观看| 免费无码国产v片在线观看| 欧美一区二区三区啪啪| 亚洲成av人片在线| 在线观看免费视频高清游戏推荐| 亚洲视频中文字幕| 触手亚洲一区二区三区| 亚洲成人三级在线| 亚洲国产欧美国产第一区| 91精品久久久久久久久久久| 久久久久在线| 高清在线观看日韩| 先锋av资源在线| 久久色精品视频| kk眼镜猥琐国模调教系列一区二区| 91精品欧美久久久久久动漫| 欧美男男青年gay1069videost| 性欧美暴力猛交另类hd| av日韩久久| 国产理论在线| 中文字幕第一区第二区| 亚洲国产成人av在线| 欧美大胆视频| 日本成人在线播放| 男人操女人免费| 国产一区二区精品在线| 色偷偷噜噜噜亚洲男人| 午夜a成v人精品| aaa国产一区| 亚欧成人精品| 精品午夜久久| 成人日韩视频| 国产视频中文字幕在线观看| 亚洲中文字幕久久精品无码喷水| 不卡视频一区| 欧美重口另类videos人妖| 精品偷拍一区二区三区在线看| 精品成人久久av| 国产精品高潮呻吟久久| 成人国产一区二区三区精品| 亚洲国产一区二区精品专区| 亚洲精品日日夜夜| 免费在线观看一区二区三区| 亚洲澳门在线| 免费观看不卡av| 在线免费观看亚洲| 日韩另类在线| av在线free| 久艹在线视频| 国产免费一区二区三区在线能观看 | 国产精品综合视频| 国产理论电影在线观看| 久久久亚洲国产美女国产盗摄| 免费在线稳定资源站| 欧美成人四级hd版| 麻豆精品一区二区av白丝在线| 中文字幕高清在线观看| 欧美日本高清视频| 成人av免费在线观看| 69xxx在线| 狠狠干一区二区| 精品免费在线观看| 久久久久久国产三级电影| 欧美国产精品久久| 中文字幕av不卡| 综合日韩在线| 午夜日韩成人影院| 探花国产精品| 欧美精品一区二区三区久久| 亚洲欧美中文字幕| 国产精品你懂的在线| 久久精品二区亚洲w码| 动漫视频在线一区| 亚洲精品成a人ⅴ香蕉片| 中文字幕免费在线视频| 亚洲国产成人tv| 国产免费区一区二区三视频免费| 亚洲欧洲精品在线观看| 在线电影欧美成精品| 亚洲最大av| 婷婷亚洲一区二区三区| 国产极品jizzhd欧美| 最新欧美精品一区二区三区| 国内不卡的一区二区三区中文字幕| 2025韩国大尺度电影| 欧美成人福利视频| 免费成人在线网站| 无遮挡爽大片在线观看视频| 久久av秘一区二区三区| 亚洲女人天堂av| 波多野结衣视频一区| 高清精品久久| a在线观看免费视频| 国产精品日韩精品欧美精品| 国产精品日韩电影| 亚洲国产另类av| 91tv精品福利国产在线观看| 国产专区在线播放| 精品久久中出| 亚洲国产精品成人av| 国产不卡视频在线播放| 91成人在线看| 超碰超碰超碰超碰超碰| 日本精品一区二区三区视频 | 国产在线观看福利| 亚洲国产另类久久久精品极度| 国产日韩欧美大片| 中文字幕日韩一区二区三区不卡| 成人亚洲综合色就1024| 日本最新高清不卡中文字幕| 大胆欧美人体视频| 97色在线观看| 2024亚洲男人天堂| 国产最新精品视频| 日韩免费在线视频| 日本一区二区免费高清| 久草在线在线| 国产精品一区而去| 亚洲精品动漫久久久久| 91日韩在线专区| 国产在视频线精品视频www666| 国产高清视频在线播放| 中文字幕av导航| 99久久er热在这里只有精品15 |