如果我有match
表达式,我怎么能让它自动忽略不匹配而不是明确做case _ =>
?有没有办法创建一个这样做的功能呢?有没有办法忽略不匹配的情况?
回答
您需要一种通用的方式来处理“忽略”。选项和其他类中提供了这个(除其他外)。所以,你可以:
val i = 7
Some(i) collect {
case 3 => "Yay!"
case 5 => "Boo!"
}
得到None
(类型为Option[String]
)。所以基本上,如果您将x match
更改为Some(x) collect
,您将获得所需的功能。当你对处理选项感到满意时,最好这样做。
任何不能处理所有可能的输入值的匹配块都会形成一个部分函数,这是绝对可以在Scala中定义和使用的。
PartialFunction
是Function
的子类,并添加了isDefinedAt
方法,如果它与提供的值具有已定义的匹配,则返回true。部分函数最适用于测试定义的位置,例如捕获块或2.8集合API中的collect
方法。否则,如果您尝试使用未定义为输入的值调用它,您将会收到异常。
写一个通用的匹配:
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
的同伴对象的方法cond
和condOpt
。
感谢您的回复。那么对于'foreach'是否没有任何类似'collect'类型函数的内建函数? – 2014-11-04 08:53:43
@MatthewSaltz没有。 – 2014-11-05 18:43:37
- 1. 有没有办法比较字符串指针忽略他们的情况?
- 2. 有没有办法忽略忽略z-index的事件?
- 3. 有没有办法忽略INSERT上不存在的列?
- 4. 有没有办法在不使用JsonIgnore属性的情况下忽略Json.NET中的只读属性?
- 5. 有没有办法忽略所有的xml解析异常?
- 6. 有没有办法让一个MeshPhongMaterial忽略所有的灯
- 7. 使用Propel时有没有办法忽略现有的表格?
- 8. 有没有办法有条件地忽略Spring的JUnit测试?
- 9. 匹配具有正则表达式的字符串忽略的情况下
- 10. 有没有办法告诉Doxygen忽略(所有)命名空间?
- 11. SVN忽略情况
- 12. 有没有办法让Firefox忽略无效的SSL证书?
- 13. 有没有办法忽略py.test中的test/conftest.py?
- 14. 有没有办法忽略Git的确切变化?
- 15. 有没有办法忽略2GB文件上传的maxRequestLength限制?
- 16. 有没有办法忽略的应用程序资源contentpresenter
- 17. 有没有办法忽略git中的几条线?
- 18. 有没有办法让git忽略文件的某些行?
- 19. 有没有办法忽略java中的退格键?
- 20. 有没有办法忽略for循环中的计数器?
- 21. 有没有办法忽略水晶报表中的组DistinctCount
- 22. 有没有办法忽略Handlebars模板中的Handlebars模板?
- 23. 有没有办法忽略来自IRC客户端的MOTD?
- 24. 有没有办法忽略XAML抛出的Visual Studio错误?
- 25. 有没有办法忽略Django中的Cache错误?
- 26. 有没有办法忽略dustJS模板中的标签
- 27. 有没有办法在不使用组的情况下引用re.sub中的完整匹配表达式?
- 28. XmlDocument.Validate在没有[XmlIgnore]的情况下忽略属性
- 29. 有没有办法让python str.partition忽略大小写?
- 30. 有没有办法使用ack忽略文件路径?
除了例外,我相信你也会在定义网站上发出警告,不是吗? – Blaisorblade 2011-03-26 23:51:53