For表达式中的类型模式

时间:2017-04-23 23:27:50

标签: scala pattern-matching

根据Scala中的 Programming ,第23.4节,for表达式可以包含模式,其中泛型形式如下所示:

for (pat <- expr1) yield expr2

将由编译器转换为以下内容:

expr1 withFilter {
  case pat => true
  case _ => false
} map {
  case pat => expr2
}

我的问题是这是否适用于类型模式,如果情况明显如下,则不明确:

val t = List("a", 1, 1.0)
for ((y : String) <- t) yield y

这里y: String被解释为类型声明,而不是类型化模式(并且不能编译)。但是,扩展表单可以正常工作:

t withFilter {
  case y :String => true
  case _ => false
} map {
  case y : String => y
}

只是想知道是否有办法在for表达式中表达该位置的类型模式。

1 个答案:

答案 0 :(得分:1)

您可以使用@ 绑定匹配的模式作为变量。像:

for (s @ (_x : String) <- t) yield s

其中(_x : String)是[{1}}的类型模式,s是变量。

以上代码将翻译为:

s