【问题标题】:Scala: Ordering[Int].lt invocation fails for reflective method callScala:反射方法调用的 Ordering[Int].lt 调用失败
【发布时间】:2016-01-23 06:07:45
【问题描述】:

我正在使用 Scala 反射和 ScalaTest。我在对象Ch2 中有如下定义的方法: def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean

如注释中所述,以下测试失败:

"Method isSorted" should "return true for a sorted array" in {
    val methods =
      Table(
        ("method"),
        ("isSorted")
      )

    val m = ru.runtimeMirror(getClass.getClassLoader)
    val mod = ru.typeOf[Ch2.type].termSymbol.asModule
    val mm = m.reflectModule(mod)
    val obj = mm.instance
    val im = m.reflect(obj)

    forAll(methods) { (m: String) =>
      val isSortedMethod = ru.typeOf[Ch2.type].decl(ru.TermName(m)).asMethod
      val isSorted = im.reflectMethod(isSortedMethod)

      // Fails at runtime with 'missing parameter type for expanded function'
      isSorted(Array(1, 2, 3, 4), Ordering[Int].lt(_, _))
    }
}

当然,我可以将Ordering[Int].lt 替换为(x: Int, y: Int) => x < y,它会起作用,但我宁愿使用已经提供的内容,而不是自己滚动。

【问题讨论】:

    标签: scala reflection scalatest mirror


    【解决方案1】:

    编译器无法在您的调用中推断类型 A。试着不加思索地拨打电话。

    您应该在调用期间指定类型,例如

    isSorted(Array(1, 2, 3, 4), (x: Int, y: Int) => Ordering[Int].lt(x, y))
    

    【讨论】:

    • "> 尝试在没有反射的情况下拨打电话。"那会破坏学习的目的。此外,考虑我以几种不同方式实现该方法的情况(请参阅this)。我可以使用数据表并反射性地调用每个方法,而不是为每个方法编写相同的测试用例。 i/p 和 o/p 相同,因此非常适合数据表。
    • @AbhijitSarkar 你对我的理解是错误的。我不建议您通过不使用反射来解决问题。我建议您检查如何在没有反思的情况下进行通话,以了解您面临的问题。然后你可以使用反射。另请参阅编辑,我已将建议的解决方案更改为适用于反射的解决方案
    • 我解决了这个问题:val lt = Ordering[Int].lt(_, _) 然后isSorted(Array(1,2,3,4), lt)
    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2018-07-06
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多