0
我在玩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是相同的,所以它是數據表的理想選擇。 –
@AhhijitSarkar你明白我的錯誤。我沒有建議你通過不使用反射來解決你的問題。我建議你在沒有反思的情況下檢查你的電話,看看你面臨的問題。然後你可以使用反射。請參閱編輯,我已將提議的解決方案更改爲使用反射的解決方案 – Archeg
我解決了此問題:'val lt = Ordering [Int] .lt(_,_)',然後是'isSorted(Array( 1,2,3,4),lt)' –