2016-07-29 9 views
2

У меня есть сценарий, где у меня есть анонимная функция, хранящаяся в вареПроверьте, какой анонимную функцию а вар в 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 каждый раз составляла одну и ту же функцию в один и тот же класс. –