我已经和Scala合作了将近一年,但我偶尔会遇到一段我不太了解的代码。这一次就是这个。我试着查看“带有通用参数类型的scala方法”的文档,但我仍然感到困惑。
def defaultCall[T](featureName : String) (block : => Option[T])(implicit name: String, list:Seq[String]) : Option[T] =
{
val value = block match {
case Some(n) => n match {
case i : Integer => /*-------Call another method----*/
case s : String => /*--------Call another method----*/
}
case _ => None
}
使用以下代码调用该方法:
var exValue = Some(10)
val intialization = defaultCall[Integer]("StringName"){exValue}
我在上面描述的代码中不理解的是defaultCall方法中的“case”语句。
我看到当exValue有一个值且不为空时,代码按预期工作。但是如果我将exValue更改为None,那么我的代码将进入“case _ = None”条件。我不明白为什么会发生这种情况,因为这里完成的匹配是针对“变量”的,它可能是整数或字符串。
答案 0 :(得分:4)
这里发生的是当你传递一个None时它将匹配第二个案例,它“捕获”所有不是某个[T]实例的东西:
block match {
case Some(n) => // Will match when you pass an instance of Some[T]
case _ => // Will match on any other case
}
请注意,None和Some是从Option继承的两个不同的类。
此外,仅在第一个匹配成功时才执行变量匹配,否则不执行。要在第一场比赛中完成类型检查,您可以这样做:
block match {
case Some(n: Int) => // do stuff
case Some(n: String) => // do stuff
case _ => // Will match on any other case
}
希望有所帮助