2016-07-29 36 views
2

我遇到的情況,我有存儲在一個VAR檢查該匿名功能的變種是Scala

val x = Integer.max _ 

匿名函數和我想要做一些邏輯像

if(x == Integer.max _){ 
    println("Using the max function") 
} 

但我我們注意到這些匿名函數永遠不會彼此相等。

val x = Integer.max _ 
val y = Integer.max _ 

println(x==y) //false 
println(x eq y) //false 

所以,無論如何,我可以檢查我有什麼匿名函數;如果我不能什麼模仿這個功能的最佳方式?

回答

2

AFAICT沒有這樣做的乾淨方式。問題在於Scala將所有匿名函數編譯成匿名類 - 所以不同的匿名函數得到不同的類(因此爲什麼==表示它們不同)。

scala> val x: (Int, Int) => Int = Integer.max 
x: (Int, Int) => Int = <function2> 

scala> x.getClass 
res: Class[_ <: (Int, Int) => Int] = class $anonfun$1 

簡單的解決方案是讓一個變量,你將使用匿名函數。例如,

val max: (Int, Int) => Int = Integer.max 
... 
val x = max 
... 
if (x == max) { 
    println("Using the max function") 
} 

否則,你可以嘗試驗證的匿名類兩種功能結構相同,但可能會被證明是相當不愉快。

+0

謝謝,這將適用於我的目的。如果scala每次將相同的函數編譯到同一個類中,它將會很好。 –