2016-01-23 79 views
0

我在玩Scala反射和ScalaTest。我有一個方法定義爲對象Ch2如下: def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): BooleanScala:排序[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,它會工作但我寧願使用已經提供的東西而不是滾動自己的東西。

回答

1

編譯器無法在您的調用中推斷出類型A。儘量撥打電話,不要反省。

你應該像

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

通話過程中指定類型「>儘量讓沒有反射的電話。」 這會挫敗學習的目的。此外,請考慮以幾種不同方式實現此方法的情況(請參閱[this](http://stackoverflow.com/questions/34960325/scala-how-do-i-use-foldleft-with-a-generic-陣列))。不用爲每種方法編寫相同的測試用例,我可以使用數據表並僅反射地調用每種方法。 I/P和O/P是相同的,所以它是數據表的理想選擇。 –

+0

@AhhijitSarkar你明白我的錯誤。我沒有建議你通過不使用反射來解決你的問題。我建議你在沒有反思的情況下檢查你的電話,看看你面臨的問題。然後你可以使用反射。請參閱編輯,我已將提議的解決方案更改爲使用反射的解決方案 – Archeg

+0

我解決了此問題:'val lt = Ordering [Int] .lt(_,_)',然後是'isSorted(Array( 1,2,3,4),lt)' –