2016-02-12 100 views
2

對於value: Any我需要檢查一個字符串大小寫。
對於其他情況,應自行返回value
什麼是正確的語法:case _ => _ ?在斯卡拉返回值本身默認模式匹配

def foo(value: Any) = value match { 
    case x: String => if (x == "cond") None else x 
    case _ => _ // Compiler -> Not found value x$1. Unbound placeholder parameter 
} 
+1

只是返回'None'或'一些(值)'(取決於您的應用程序邏輯),如果你不關心非匹配參數,錯誤是告訴你不能返回佔位符。 –

+0

模式匹配類型違反參數 - http://typelevel.org/blog/2014/11/10/why_is_adt_pattern_matching_allowed.html。 –

回答

4

只需使用一些(任意)標識,而不是_

def foo(value: Any) = value match { 
    case x: String => if (x == "cond") None else x 
    case other => other 
} 

然而,這是不是在某些情況下返回None最佳實踐,如果你在其他情況下不返回Some。更正確的版本是:

def foo(value: Any) = value match { 
    case "cond" => None 
    case other => Some(other) 
} 

然後在這兩種情況下,你有Option類型的對象。

3

簡單以及是這樣的簡單的if-else表達,

def foo(value: Any) = if (value == "cond") None else Some(value) 

更復雜的位是這樣的,

def foo(value: Any) = Option(value).find(_ != "cond") 

它提供None僅當value等同"cond"。還可以考慮使用一種理解如下,

def foo(value: Any) = for (v <- Option(value) if v != "cond") yield v