自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

學(xué)習(xí)Scala中的Case類

開發(fā) 后端
本文介紹Scala中Case類的一些使用心得。

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

Scala支持case類的概念。case類也是正規(guī)的類,暴露其構(gòu)造器參數(shù),并通過模式匹配提供遞歸解構(gòu)機制。 以下是由抽象超類Term和三個具體case類Var,F(xiàn)un,和App組成的類層次的例子。

  1. abstract class Term  
  2. case class Var(name: String) extends Term  
  3. case class Fun(arg: String, body: Term) extends Term  
  4. case class App(f: Term, v: Term) extends Term 

這個類層次可以用來表現(xiàn)無類型lambda算子。為了便于case類實例的構(gòu)建,Scala不需要使用new原語。只要簡單地把類名用作函數(shù)即可。舉例如下:

  1. Fun("x", Fun("y", App(Var("x"), Var("y"))))  

case類的構(gòu)造器參數(shù)被當(dāng)作公開值并可以直接被訪問。

  1. val x = Var("x")  
  2. Console.println(x.name) 

對于每個case類,Scala編譯器將產(chǎn)生實現(xiàn)了結(jié)構(gòu)相等性檢查的equals方法和一個toString方法。舉例如下:

  1. val x1 = Var("x")  
  2. val x2 = Var("x")  
  3. val y1 = Var("y")  
  4. println("" + x1 + " == " + x2 + " => " + (x1 == x2))  
  5. println("" + x1 + " == " + y1 + " => " + (x1 == y1)) 

將打印

  1. Var(x) == Var(x) => true 
  2. Var(x) == Var(y) => false 

只有在分解數(shù)據(jù)結(jié)構(gòu)的時候用到了模式匹配的情況下,定義case類才是有意義的。以下的對象為我們的lambda算子的展示定義了漂亮的打印函數(shù):

  1. object TermTest extends Application {  
  2.   def printTerm(term: Term) {  
  3.     term match {  
  4.       case Var(n) =>  
  5.         print(n)  
  6.       case Fun(x, b) =>  
  7.         print("^" + x + ".")  
  8.         printTerm(b)  
  9.       case App(f, v) =>  
  10.         Console.print("(")  
  11.         printTerm(f)  
  12.         print(" ")  
  13.         printTerm(v)  
  14.         print(")")  
  15.     }  
  16.   }  
  17.   def isIdentityFun(term: Term): Boolean = term match {  
  18.     case Fun(x, Var(y)) if x == y => true 
  19.     case _ => false 
  20.   }  
  21.   val id = Fun("x", Var("x"))  
  22.   val t = Fun("x", Fun("y", App(Var("x"), Var("y"))))  
  23.   printTerm(t)  
  24.   println  
  25.   println(isIdentityFun(id))  
  26.   println(isIdentityFun(t))  

我們的例子里,函數(shù)print表達為開始于match關(guān)鍵字的,由一系列的case Pattern => Body子句組成的模式匹配語句。

上面的程序還定義了函數(shù)isIdentityFun,用來檢查是否給定的term對應(yīng)于一個簡單的身份函數(shù)。這個例子使用了深度模式和護衛(wèi)語句。在使用給定值匹配了模式之后,護衛(wèi)語句(定義于關(guān)鍵字if之后)被執(zhí)行評估。如果返回true,匹配成功;反之,則匹配失敗,并嘗試下一個模式。

原文來源:Scala官方網(wǎng)站

【相關(guān)閱讀】

  1. Groovy創(chuàng)始人:Java面臨終結(jié) Scala將取而代之
  2. Scala的類型系統(tǒng):取代復(fù)雜的通配符
  3. Scala的類型系統(tǒng) 比Java更靈活
  4. Java程序員,你為什么要關(guān)注Scala
  5. Scala編程語言
責(zé)任編輯:yangsai 來源: Regular
相關(guān)推薦

2009-07-21 11:25:03

ScalaRational類

2009-07-22 07:53:00

Scala擴展類

2009-07-20 16:56:51

Scala類的定義

2009-06-19 11:13:47

Scalacase類模式匹配

2009-09-28 11:37:03

Journal.scaKestrel

2009-11-16 17:04:46

Inside Scal

2009-07-21 16:58:31

Scala變量范圍

2009-06-19 13:16:36

Scala計算器解析器組合子

2009-07-22 07:43:00

Scala閉包

2009-06-16 17:54:38

Scala類語法語義

2009-07-22 09:31:59

Scala類類層級Java類

2009-07-22 07:50:00

Scala二維布局庫抽象類

2009-07-22 07:57:00

ScalaCurry化函數(shù)

2009-09-09 11:37:08

Scala的模式匹配

2009-07-21 08:54:35

Scala富包裝器

2009-07-22 08:45:35

Scala超類構(gòu)造器override修飾符

2009-07-22 09:22:20

Scala工廠對象

2009-08-03 11:07:18

Scala Actor

2009-07-22 07:47:00

Scala客戶代碼

2009-06-08 21:45:46

Javaswitch-case
點贊
收藏

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