Is there a full specification for pattern matching possibilities of Scala?
scala的模式匹配可能性是否有完整的规范?
我无法修复以下代码:
1 2 3 4 5 6
| something match {
case e @ (sae : ServerApiException if sae. statusCode == 401 | _: UnauthorizedException ) => {
doSomething (e )
}
...
} |
(它不在2.8.1中编译。)
- 不是最具描述性或帮助性的问题标题…这是相当模糊的,人们可能会滚动过去,除非他们现在感到无聊。实际上,正文的第一行应该是一个更好的标题("scala的模式匹配可能性有完整的规范吗?").
- 标题更新。
- 告诉我们什么不起作用。编译错误?运行时结果错误?例外?
- 问题已更新。
我不确定我会用这种方式编写代码;这很难理解(除了不以原始形式工作之外)。
我想买点像
1 2 3 4 5
| def doSomething (e : Exception ) = { /* whatever */ }
something match {
case sae : ServerApiException if (sae. statusCode == 401) => doSomething (sae )
case ue : UnauthorizedException => doSomething (ue )
} |
以避免重复代码。或者您可以使用选项:
1 2 3 4 5
| (something match {
case sae : ServerApiException if (sae. statusCode == 401) => Some (sae )
case ue : UnauthorizedException => Some (ue )
case _ => None
}). foreach(e => /* do something */ ) |
如果你喜欢以后写这个方法。但我认为第一种方法可能是最清楚的。
- 这些选项对我有何帮助?
- 选项允许您编写(something match { /* blah */ }).foreach(e => /* whatever */),只有匹配并转化为Some(x)的案例才能通过并在foreach步骤中在e中传递。None案无济于事。因此,option/foreach方法与方法def版本执行的操作完全相同,只是步骤的顺序不同,并且在某种程度上保证您不能将doSomething方法用于其他任何操作(因为它没有命名——在第二种情况下,它只是e =>之后的代码)。
- 但如何处理其他案件(…)?
- 你没有具体说明你担心的其他案件。
- 还有一些例外。
- 把你想处理的每一个Some包起来,让其他的都落入None中。
- 所以您的意思是嵌套两个模式匹配块来处理其他异常?
- 如果对于如何处理异常有许多不同的情况,那么第一个模式更好。第二种是一种很好的选择,如果你有两类例外——一类是你可以保存在Some中,另一类是你可以忽略的None中。
scala语言规范第8章?(PDF)。
更具体地说,这个答案可能会有所帮助,也就是说,你应该能够做如下的事情:
1 2 3
| case e : Exception if e. isInstanceOf[UnauthorizedException ] || (e. isInstanceOf[ServerApiException ] && e. asInstanceOf[ServerApiException ]. statusCode == 401) => {
doSomething (e )
} |
- 它不编译,因为Exception没有statusCode成员。
- @tn:编辑以添加显式强制转换,并实际尝试编译此版本。虽然不是最漂亮的密码…
- +1 THX提示。
最后,我在scala语言规范(scala语法摘要)的帮助下进行了管理:
- 我更喜欢这个方向。
- 我想实际的上下文可能更复杂,但这个具体的例子可能更直接,如something match { case sae:ServerApiException if sae.statusCode == 401 => doSomething(sae); case ue: UnauthorizedException => doSomething(ue); }所示。
- 是的,实际的代码doSomething更复杂,因此我正在寻找一个更好的解决方案。