编译器如何解释它?:
foo match { case bar: Bar => println("First case statement") case _ => }
字符串第二个case是空的,没有返回任何内容。
btqmn9zl1#
在模式匹配示例中,*emptydefault * case是必需的,因为否则match表达式将为每个不是bar的expr参数抛出MatchError。没有为第二种情况指定任何代码,因此如果该情况运行,它什么也不做。任何一种情况的结果都是Unit值(),因此,它也是整个匹配表达式的结果。有关它的更多细节,请参阅Martin Odersky的Programming in Scala一书中的Case Classes and Pattern Matching**一章。
oiopk7p52#
返回Unit:
Unit
val res: Unit = new foo match { case bar: Bar => println("First case statement") case _ => }
字符串如果你改变你的语句返回一些东西而不是println(返回Unit):
println
val res: Any = new foo match { case bar: Bar => "it's a bar" case _ => }
型现在编译器已经推断出Any,因为它是String和Unit之间的第一个公共超类型。请注意,您的case match是错误的,因为仅对bar进行匹配意味着捕获所有变量,您可能需要bar: Bar。
Any
String
bar
bar: Bar
2条答案
按热度按时间btqmn9zl1#
在模式匹配示例中,*emptydefault * case是必需的,因为否则match表达式将为每个不是bar的expr参数抛出MatchError。
没有为第二种情况指定任何代码,因此如果该情况运行,它什么也不做。
任何一种情况的结果都是Unit值(),因此,它也是整个匹配表达式的结果。
有关它的更多细节,请参阅Martin Odersky的Programming in Scala一书中的Case Classes and Pattern Matching**一章。
oiopk7p52#
返回
Unit
:字符串
如果你改变你的语句返回一些东西而不是
println
(返回Unit
):型
现在编译器已经推断出
Any
,因为它是String
和Unit
之间的第一个公共超类型。请注意,您的case match是错误的,因为仅对
bar
进行匹配意味着捕获所有变量,您可能需要bar: Bar
。