多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

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

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

在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的簡捷與優雅。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美一级日韩在线观看 | 国产大片51精品免费观看 | 宅男午夜在线 | 欧美天天| 欧美福利网站 | 国产亚洲精品热视频在线观看 | 美国一级淫片 | 乱码在线中文字幕加勒比 | 尤物视频免费观看 | 中文字幕一区二区三区免费看 | 日韩 欧美 亚洲国产 | 国内精品久久久久影院亚洲 | 欧美亚洲777| 欧美 日韩 国产 成人 在线观看 | 国内老司机精品视频在线播出 | 欧美专区视频 | 国产精品亚洲欧美一级久久精品 | 国产精品亚洲综合一区在线观看 | 亚洲天堂.com | 欧美视频亚洲 | 亚洲精品国产第1页 | 亚洲人成综合在线播放 | 动漫网站在线观看 | 亚洲产国偷v产偷v自拍涩爱 | 伊人久久大香线蕉亚洲 | 99热久久这里只有精品首页 | jizz日| 国产片欧美片亚洲片久久综合 | 欧美日韩综合一区 | 在线综合亚洲欧美网站天堂 | 国产婷婷一区二区在线观看 | 欧美xxxx做受欧美人妖 | 日韩欧美一区二区三区在线观看 | 亚洲国产欧美视频 | 我想看一级毛片免费的 | 欧美在线aa| 久久国产精品二国产精品 | 在线看逼 | 国产精品成熟老女人 | 亚洲天堂一区二区三区 | 噜噜噜在线视频免费观看 |