2016-07-29 9 views
2

Ich habe ein Szenario, in dem ich eine anonyme Funktion in einer var gespeichertPrüfen Sie, welche anonyme Funktion ein var in Scala ist

val x = Integer.max _ 

und ich möchte wie

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

eine gewisse Logik zu tun, aber ich Ich habe bemerkt, dass diese anonymen Funktionen niemals einander gleichen.

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

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

So gibt es sowieso ich kann überprüfen, welche anonyme Funktion ich habe; und wenn ich nicht kann, was ist der beste Weg, diese Funktionalität nachzuahmen?

Antwort

2

AFAICT es gibt keinen sauberen Weg, dies zu tun. Das Problem ist, dass Scala alle anonymen Funktionen in anonyme Klassen kompiliert - so dass verschiedene anonyme Funktionen verschiedene Klassen erhalten (daher wies == darauf hin, dass sie unterschiedlich sind).

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

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

Die einfache Lösung besteht darin, eine Variable für die anonyme Funktion zu erstellen, die Sie verwenden werden. Zum Beispiel

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

Andernfalls könnten versuchen Sie überprüfen, ob die anonyme Klassen für beide Funktionen strukturell identisch sind, aber das könnte sich herausstellen, um ziemlich unangenehm zu sein.

+0

Danke, das wird für meine Zwecke funktionieren. Obwohl es nett wäre, wenn scala jedes Mal dieselbe Funktion in dieselbe Klasse kompiliert. –

Verwandte Themen