日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > scala中判斷一個對象是否是元組(Tuple)

scala中判斷一個對象是否是元組(Tuple)

來源:程序員人生   發布時間:2013-12-19 10:13:09 閱讀次數:3848次

在scala user郵件列表中看到一個函數,判斷一個對象是否是元組。從這個函數中,Easwy才了解到原來模式匹配(Pattern Match)也可以應用于正則表達式,這使得在scala中使用正則表達式(regex)更加容易了。另外,這個函數還展現了scala的另外兩個特點:

  1. 盡量使用遞歸解決方案,而不是使用循環。這樣做的優點之一是避免使用變量,優點之二是代碼簡潔。是否有其它優點,Easwy仍在總結。但Easwy始終有個擔心,遞歸會不會導致效率降低?會不會有堆棧溢出風險?
  2. 使用Option類型做為函數返回值。使用Option類型的好處很明顯,這樣你的函數既可以返回執行失敗的情況(None),也可以在執行成功時給出有用的返回值。這比使用tru/false作為返回值方便很多。

函數主體如下,為了方便講解,在前面加了行號:

 val Ptrn = """scala.Tuple(d+)""".r def checka( x: Class[ _ ]) : Option[ Int ] = x.getName match {      case Ptrn( i ) => Some( i.toInt )      case _ => { val sc = x.getSuperclass; if( sc != null ) checka( sc ) else None } } def isTuple( x: AnyRef ) = if( x.isInstanceOf[ Product ]) checka( x.getClass ) else None    
  1. 行1定義了一個Pattern對象,可以看到,在scala中使用正則表達式非常的簡單。
  2. 行3定義了一個遞歸函數checka(),它的參數是Class[_],返回值是Option[Int]類型。參數”Class[_]“的意思是這個函數可以接受任意Class[A]類型,也就是接受任何參數化的Class類型(Type Parameterization)。

  3. 從行3的后半句,到行5,是一個模式匹配,檢查類的名字是否匹配正則表達式Ptrn。如果類名匹配Ptrn,也就是說是一個Tuple,則返回它的維數。例如,對Tuple3返回Some(3)。如果類名不匹配Ptrn,遞歸調用checka()檢查其父類是否為Tuple,如果全部失敗,則返回None。
  4. 行8定義isTuple()函數,調用checka()判斷是否為Tuple。它首先會檢查x是否是一個Product實例,滿足時才調用checka(),否則直接返回None。

Easwy感覺checka()函數中的遞歸寫的不是很好,在看過”The Little Schemer”后,Easwy更傾向與下面的寫法:

  def checka(x: Class[_]): Option[Int] = x match {    case null => None    case _ => x.getName match {      case Ptrn(i) => Some(i.toInt)      case _ => checka(x.getSuperclass)    }  }     

下面是Easwy用來測試該函數的程序,全文如下:

object TestTuple {  def main(args: Array[String]) {    class ttt(a: Any, b: Any, c: Any) extends Tuple3(a, b, c)    val test = List(new Tuple2(1, 2), new ttt(1, 2, 3), "Hello World")    for (elem <- test)      isTuple(elem) match {        case None => println("Not Tuple")        case Some(x) => println("Is Tuple" + x)      }  }  val Ptrn = """scala.Tuple(d+)""".r  def checka(x: Class[_]): Option[Int] = x match {    case null => None    case _ => x.getName match {      case Ptrn(i) => Some(i.toInt)      case _ => checka(x.getSuperclass)    }  }  def isTuple( x: AnyRef ) = if( x.isInstanceOf[ Product ]) checka( x.getClass ) else None}

有興趣的朋友可以編譯運行一下,體會一下scala的簡捷與優雅。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产视频一二区 | 欧美日韩免费网站 | 久久只精品99品免费久23小说 | 91精品久久久久久9s密挑 | 懂色av粉嫩av绯色 | 狠狠干天天干 | 国产精品福利片 | 亚洲iv一区二区三区 | 最近中文字幕在线视频 | 成人毛片在线观看 | 曰韩黄色一级片 | 看全色黄大色黄大片女图片第一次 | 成人福利 | 精品视频免费看 | 快射视频在线观看 | 国产精品久久久久av | 999精品视频在这里 亚洲一级免费观看 | 国产欧美日韩在线视频 | 最新亚洲| 爱情岛论坛首页永久网址 | 三级在线看| 91亚洲国产成人久久精品网站 | 国产高清一级毛片在线不卡 | 亚洲综合色自拍一区 | 日韩电影一区二区三区 | 日韩精品极品在线观看 | 国产91在线 | 中日 | 亚洲精品一区二区三区中文字幕 | 亚洲免费在线看 | 欧美一区二区三区公司 | 91网站在线免费看 | 久久久久久久一区二区三区 | 成人午夜视频在线观看 | 91av导航 | 久久久久国产 | 亚洲精品久久久久 | 色伊人网| a级高清免费毛片av在线 | 九九热免费看 | 欧美中文在线观看 | 成人污视频在线观看 |