【问题标题】:Scala Try[String] found instead of String找到 Scala Try[String] 而不是 String
【发布时间】:2018-03-09 12:01:20
【问题描述】:

我试图了解 Try 在 scala 中的工作方式(不是 try/catch),而是 Try。举个例子,这里我想检查文件是否存在,如果存在,我会在后面的代码中使用文件中的数据,但是它不起作用:

val texte = Try(Source.fromFile(chemin_texte).getLines().filter(_!="").foldLeft(""){_+_})
        texte match {
          case Success(x) => x
          case Failure(e) => println("An error occured with the text file"); println("Error: " + e.getMessage)
        }

        /*phrases du texte*/
        val phrases_txt = split_phrases(texte).map(phrase => phrase)

val phrases_txt 如果文件存在,我希望使用texte 的输出,否则程序应该在Failure(e) 停止。

我得到的错误是类型不匹配;找到:scala.util.Try[String] required: String。

有什么帮助吗?谢谢。

【问题讨论】:

  • 您需要将匹配结果分配给一个变量。 texte 是 Try[String]。成功时,匹配的结果是您要传递给split_phrases 的String。
  • 是的,我明白你的意思,但是如果我这样做 val temp = texte match ...,那么我不能调用 split_phrases(temp) 因为它说它返回 Any 而不是 String - 我同意在成功的情况是一个字符串,但我们不考虑失败
  • 哦,是的...您可能想map Try: texte.map(x => split_phrases(x)...) 然后在最后而不是中间检查是否成功。
  • 在这种情况下,我最好的建议是为代码中的每个 var/val 添加显式类型。如果您使用的是 IDE,那就更容易了。你会看到一些 val 这不是你想要的类型

标签: scala file io functional-programming try-catch


【解决方案1】:

将Try 视为可能失败的计算的容器。它不能与 try 和 catch 块相提并论,因为它们只是“抛出”异常,预计稍后将在程序中处理这些异常。 Scala Try 强制您确保从那时起在您的程序中始终处理可能的错误。

你可以这样做:

val texte = Try(Source.fromFile(chemin_texte).getLines().filter(_!="").foldLeft(""){_+_})

val phrases: Try[List[String]] = texte.map(split_phrases)

我看不出.map(phrases => phrases) 的意义,因为它会返回相同的对象。 map 函数的类型为 T[A] => T[B],这意味着对于类型为 A 的容器,map 将在 容器的内容上运行给定函数 f /em> 并生成一个B 类型的容器,其中函数f 负责将A 类型的对象转换为B 类型。

如果您希望在程序中进一步使用您的phrases 对象和产生Try 值的其他值,您可以使用flatMap 函数或for 表达式,让生活更轻松。例如:

val morePhrases: Try[List[String]] = ???

def mergePhrases(phrases1: List[String], phrases2: List[String]): Phrases = phrases1 ++ phrases2

val mergedPhrases: Try[List[String]] = for {
  p1 <- phrases
  p2 <- morePhrases
} yield mergePhrases(p1, p2) // Only for demonstration, you could also do yield p1 ++ p2

上面代码中的mergedPhrases 值只是一个Try 容器,其中包含mergePhrases 函数对phrases 和morePhrases 的内容应用的结果。

请注意,Try 块可能并非始终是在程序结束时捕获错误的最佳方法,您将知道第一个错误是什么,但您不知道究竟是什么错误是。这就是为什么我们有 Either 这样的东西。

【讨论】:

  • 非常感谢您的回答。但是 xxx match { case Success() and Failure() } 呢?
猜你喜欢
  • 2017-05-03
  • 2020-07-22
  • 2021-10-16
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多