2010-11-06 64 views

回答

2

我猜你正在尋找match(或者只是if/else if/else)。

2
case class Paired(x: Int, y: Int) 

def foo(x: Any) = x match { 
    case string : String => println("Got a string") 
    case num : Int if num < 100 => println("Number less than 100") 
    case Paired(x,y) => println("Got x and y: " + x + ", " + y) 
    case unknown => println("??: " + unknown) 
} 

前兩個case語句顯示基於類型的模式匹配。第三部分顯示了使用提取器將數據分解爲組成部分並將這些部分分配給變量。第三個顯示了可以匹配任何東西的可變模式匹配。未示出的是殼體_:

case _ => println("what") 

其中相同的可變模式匹配,匹配任何東西,但是匹配的對象不結合的變量。

頂部的情況下,類是Scala中簡寫用於創建提取器以及類本身。

1

當然,matchif都不會與cond完全相同。一種可能性是這樣做:

object Cond { 
    def apply(clauses: Iterable[(()=>Boolean,()=>Any)]): Any = { 
    clauses find (_._1()) map (_._2()) getOrElse() 
    } 
} 

這個對象接受的東西可迭代,其中每個項目是一對返回布爾和返回任何函數的函數。它試圖找到第一個函數返回true的項目,停止查找是否找到一個項目,在找到的項目上調用第二個函數並返回該函數的結果(如果沒有找到,則返回結果)。

例子:

val clauses = Seq(
    ({()=>false}, {()=>println("foo")}), 
    ({()=>true}, {()=>println("bar")}) 
) 
Cond(clauses) 

def checkYear(year: Int) = { 
    Cond(Seq(
    ({()=>year % 400 == 0}, {()=>42}), 
    ({()=>true}, {()=>{c:Char => (c.toString * 3)}}) 
)) 
} 

ETA:是的,我知道這是醜陋的,但它的工作原理。