7

给定以下代码片段:

import scala.util.Try

def foo(x:Int) : (Int, String) = {
  (x+1, x.toString)
}

def main(args: Array[String]) : Unit = {
  val r1: Try[(Int, String)] = for {
    v <- Try { foo(3) }
  } yield v

  val r2: Try[(Int, String)] = for {
    (i, s)  <- Try { foo(3) } // compile warning refers to this line
  } yield (i, s)
}

1. 为什么编译上述代码会抛出以下警告?

`withFilter' method does not yet exist on scala.util.Try[(Int, String)], using `filter' method instead
[warn]       (i, s)  <- Try { foo(3) }
[warn]                      ^
[warn] one warning found

withFilter2.提取到元组时为什么要使用?

更新

  • Scala 2.10.5 出现警告
  • Scala 2.11.7不会出现警告

独立于警告消息,我很想知道是否withFilter使用了?(见问题 2)

4

1 回答 1

4

它似乎Try.withFilter只在 2.11 中添加(参见Try2.10.6Try2.11.0

withFilter用于而不是for 理解,因为它是懒惰的,您可以在这个问题filter中阅读更全面的比较。

您的第二个理解类似于:

Try(foo(3)).withFilter {
  case (i, s) => true
  case _      => false
} map(identity)

因为在 Scala 2.10.5Try.withFilter中不存在,所以它回退到 using filter(这会创建一个 new Try)。


编辑:在您的情况下,您为什么需要withFilter它并不那么明显,因为您实际上并没有使用(i, s)模式匹配进行过滤。

如果您在下面编写了 for 理解,那么当您在 for 理解的左侧添加模式匹配时,您(可以)进行过滤会更清楚。

for {
  (i, "3") <- Try(foo(3))
} yield i

这类似于:

Try(foo(3)) withFilter {
  case (i, "3") => true
  case _        => false
} map { case (i, "3") => i }

如您所见withFilter,不仅在添加 if 保护时使用,而且在模式匹配时也使用。

于 2015-10-21T10:45:41.563 回答