【问题标题】:Changing Return type of a function in Scala在 Scala 中更改函数的返回类型
【发布时间】:2019-12-29 17:40:18
【问题描述】:

我需要编写一个返回类型为NodeSeq (scala.xml.NodeSeq)的函数,
在下面的函数中,我试图通过使用下面的代码评估表达式来获取 XML 文件的 NodeSeq。编译器抛出类型不匹配错误。

import scala.reflect.runtime.universe

def someFunc(params): NodeSeq = {
  some code
  ....
  val evaluator = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
  val data: NodeSeq = evaluator.eval(evaluator.parse(expression))  // return type - Any

  if(data.getClass.getName == scala.xml.NodeSeq) data else NodeSeq.Empty
}

val 数据 理想情况下应该包含 NodeSeq(来自我拥有的数据),但我正在评估一个表达式,表达式的返回类型可以是任何东西,

我明白了,为什么我不能使用上面的代码返回 NodeSeq,
我能想到的最好的就是最后一个 if 条件。
有什么办法可以将此函数的返回类型从 Any 更改为 NodeSeq?

【问题讨论】:

  • 尝试使用pattern matching 而不是检查类名。当然,您不应该将 String 与 Class 进行比较:它是不同的类型。
  • 感谢@MikhailIonkin,我现在可以更改返回类型了。另外,您能否将其发布为答案,以便我接受您的解决方案并关闭此问题。
  • 好的,我贴出来了。

标签: xml scala return-type scala-reflect


【解决方案1】:

当结果(或操作)取决于类型或值时,您可以使用pattern matching。它是switch 的更强大版本。

以下代码已由 Luis Miguel Mejía Suárez 在对已删除答案的评论中提交:

val data: NodeSeq = evaluator.eval(evaluator.parse(expression)) match {
  case n: NodeSeq => n
  case _ => NodeSeq.Empty
}

在某些情况下,如果您没有考虑所有可能的情况,编译器会警告您 (match may not be exhaustive)。如果您在模式匹配中使用无结果类型(例如 List[String] 而不是 List[Int]),Intellij Idea 和 SBT 都会警告您。

你不应该比较字符串(data.getClass.getName)和类(scala.xml.NodeSeq),因为你会得到编译错误。不推荐使用类名来检查类(如data.getClass.getName == "scala.xml.NodeSeq"),因为至少编译器不会检查,如果data == null,你会得到NullPointerException

还有另一种方法:通过isInstanceOf 查课。但也不推荐,因为isInstanceOf不检查泛型类型:List(1).isInstanceOf[List[String]]会返回true

对不起我的英语。

【讨论】:

  • 感谢@Mikhail 提供的信息,我开始学习Scala,很高兴知道这些细节,不要抱歉,我能够清楚地理解你在说什么.
猜你喜欢
  • 2014-05-29
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
相关资源
最近更新 更多