2016-02-12 98 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