2012-09-04 62 views
7

可能重複:
Scala: short form of pattern matching that returns BooleanScala是否有一個「test-if-match」操作符?

在我的Scala代碼我發現自己經常寫東西像下面這樣:

x match{ 
    case Type(params) => doStuffWith(params) 
    case _ => /* do nothing*/ 
} 

是否已有一些預定義的運營商做這個?我認爲,如果我能寫出如下內容會更清楚:

if(x match Type(params)) { 
    doStuffWith(params) 
} 

本質上避免了奇怪的情況。我還有其他一些能夠驗證內聯模式中某個模式是否匹配的情況,可以爲我節省一大筆額外的大括號。

我知道這樣的事情在編寫更多迭代代碼時可能只會更有用,但Scala似乎有這麼多隱藏功能,我想知道是否有人有一個簡單的解決方案。

+1

你看着提取? – phant0m

+0

許多內置類型也有此謂詞,例如isither/isRight,List的isNil,Options isNone等 – Squidly

回答

7

你可以liftAnyA部分功能到一個函數從AnyOption[A]

爲了使語法很好首先定義一個輔助函數:

def lifted[A](pf: PartialFunction[Any,A]) = pf.lift 

然後,使利潤:

val f = lifted { 
    case Type(i) => doStuff(i) 
} 

scala> f(2) 
res15: Option[Int] = None 

scala> f(Type(4)) 
res16: Option[Int] = Some(8) 

doStuff方法只有在參數匹配來調用。你可以有幾個案例子句。

3

我能想到的最簡單的辦法是在選擇包裝的價值和使用collect方法:

Option(x).collect { case Type(params) => doStuffWith(params) } 
3

使用@ phant0m給的鏈接,拼寫出來:

import PartialFunction.condOpt 

condOpt(x){ case Type(params) => doStuffWith(params) } 
0

如果這種模式在代碼中經常出現,你應該考慮將doSomeStuffType的方法。 Scala中的Case類是普通的類,當它們有意義時,您應該使用面向對象的特性。否則,可以在層次結構的頂部添加一個方法,假設所有的案例類都擴展了一個共同的特徵。例如:

class Base { 
    def whenType(f: (T1, T2) => Unit): Unit = this match { 
    case Type(t1, t2) => f(t1, t2) 
    case _ =>() 
    } 
} 

,然後你可以使用x whenType doSomeStuff

相關問題