2014-02-17 2 views
2

Этот полезный StackOverflow answer утверждает, что сравнивать две функции невозможно.FunctionN # == Оценка до False

Для следующего, я получаю `ложь, как и ожидалось:

Защиту

scala> def add1Test: Int => Int = { println("3"); _ + 1 } 
add1Test: Int => Int 

scala> add1Test == add1Test 
3 
3 
res4: Boolean = false 

scala> :t add1Test(5) 
Int 

Function1

scala> def foo: Function1[Int, Int] = _ + 1 
foo: Int => Int 

scala> :type foo 
Int => Int 

scala> foo == foo 
res6: Boolean = false 

вал

Однако, для val, я получаю это.

scala> val valAdd1: Int => Int = { println("val"); _ + 1} 
val 
valAdd1: Int => Int = <function1> 

scala> valAdd1 == valAdd1 
res3: Boolean = true 

scala> :t valAdd1 
Int => Int 

Почему сравнение def и Function результата в ложном, но верно для val?

Кроме того, почему ложь, а не другое поведение (например: Исключение выбрано), возвращается при сравнении def и Function?

ответ

4

Первые два случая дают false, потому что add1Test == and1Test (а также foo == foo) сравнивает два различных объектов, которые реализуют интерфейс Function1. add1Test == and1Test переводит на что-то вроде new AbstractFunction1() { ... }.equals(new AbstractFunction1() { ... }) (из-за специализации примитивов фактический код немного сложнее, но идея такая же). Поскольку левая и правая стороны относятся к разным объектам, а эквивалентность функций - это просто эквивалентность их экземпляров, результатом является false.

Третий случай сравнивает же объекта (потому что он был создан с помощью val) и, следовательно, возвращает true.

+0

Ах. поэтому сравнение «def» и «Function» выполняется на разных объектах в памяти, что объясняет «false». И сравнение 'val's' приводит к' true', учитывая, что каждый объект имеет одинаковый адрес памяти. благодаря –

Смежные вопросы