2011-03-26 46 views

回答

27

您需要一种通用的方式来处理“忽略”。选项和其他类中提供了这个(除其他外)。所以,你可以:

val i = 7 
Some(i) collect { 
    case 3 => "Yay!" 
    case 5 => "Boo!" 
} 

得到None(类型为Option[String])。所以基本上,如果您将x match更改为Some(x) collect,您将获得所需的功能。当你对处理选项感到满意时,最好这样做。

2

任何不能处理所有可能的输入值的匹配块都会形成一个部分函数,​​这是绝对可以在Scala中定义和使用的。

PartialFunctionFunction的子类,并添加了isDefinedAt方法,如果它与提供的值具有已定义的匹配,则返回true。部分函数最适用于测试定义的位置,例如捕获块或2.8集合API中的collect方法。否则,如果您尝试使用未定义为输入的值调用它,您将会收到异常。

+0

除了例外,我相信你也会在定义网站上发出警告,不是吗? – Blaisorblade 2011-03-26 23:51:53

11

写一个通用的匹配:

object Match { 
    def default: PartialFunction[Any, Unit] = { case _ => } 
    def apply[T](x: T)(body: PartialFunction[T, Unit]) = (body orElse default)(x) 
} 

例子:

scala> 1 to 5 foreach (Match(_) { 
    | case 2 => println("two") 
    | case 3 => println("three") 
    | } 
    |) 
two 
three 

您可能会感兴趣太PartialFunction的同伴对象的方法condcondOpt

+0

感谢您的回复。那么对于'foreach'是否没有任何类似'collect'类型函数的内建函数? – 2014-11-04 08:53:43

+0

@MatthewSaltz没有。 – 2014-11-05 18:43:37

相关问题