Я играю с отражением Scala и ScalaTest. Я метод, определенный следующим образом в объекте Ch2
: def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean
Scala: Заказ [Int] .lt вызов не выполняется для вызова метода рефлексии
Следующий тест не так, как описано в комментарии:
"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
и было бы работать но я предпочел бы использовать то, что уже было предоставлено, вместо того, чтобы кататься самостоятельно.
«> Попробуйте сделать вызов без отражения.» Это победит цель обучения. Кроме того, рассмотрим случай, когда я реализую метод несколькими способами (см. [This] (http://stackoverflow.com/questions/34960325/scala-how-do-i-use-foldleft-with-a-generic- массив)). Вместо того, чтобы писать одинаковые тестовые примеры для каждого метода, я мог бы использовать таблицу данных и просто ссылаться на каждый метод рефлексивно. I/p и o/p одинаковы, поэтому это идеальный кандидат для таблиц данных. –
@AbhijitSarkar Вы поняли меня не так. Я не советовал вам исправить вашу проблему, не используя рефлексию. Я посоветовал вам проверить, как сделать свой звонок без размышлений, чтобы увидеть проблему, с которой вы столкнулись. И тогда вы можете использовать отражение. Также см. Редактирование, я изменил предлагаемое решение на то, которое работает с рефлексией. – Archeg
У меня возникла проблема с этим: 'val lt = Ordering [Int] .lt (_, _)', а затем 'isSorted (Array (1,2,3,4), lt) –