Deutsch

C# - pattern matching - many discards

10.03.24 10:40
Re: C# - pattern matching - many discards
 
MrSanders коренной житель
в ответ Срыв покровов 09.03.24 20:09, Последний раз изменено 10.03.24 11:12 (MrSanders)
сорри за возможно глупый вопрос: но вот это разве не делегаты?

Вот кстати да, как уточняет AlexNek, было бы неплохо определиться, а что мы вообще делегатами называем.

Для меня делегат это "переменная-метод". Которую можно использовать как метод.

Т.е. чтобы можно было сделать так:

Function<Integer, Double> half = a -> a /2.0;
// Applying the function to get the result
System.out.println(half(10));

В яве так сделать нельзя.
И этот "конструкт" должен быть "first-class citizen". Выполнять все 4 требования. В яве ссылки нa методы нельзя сравнивать. Не работает.

import java.util.function.Function;
public class MyClass {
    public static String value(int i) {
        return "Value: " + i;
    }
    public static void main(String args[]) {
      Function<Integer, String> f1 = MyClass::value; 
      Function<Integer, String> f2 = MyClass::value;    
      System.out.println("Same method? : " + f1.equals(f2));
    }
}

Вернёт false.


Function<Integer, Double> half = a -> a /2.0; компилятором превращается в

Function<Integer, Double> half = new Function<Integer, Double>() {
  @Override
  public Double apply(Integer t) {
    return t / 2.0;
  }
}

Новый класс. Сделали ещё раз то же самое, получили ещё один новый класс. То же и с ссылками,

из Function<Integer, String> f1 = MyClass::value; получается

Function<Integer, String> f1 = new Function<Integer, String>() {
  @Override
  public String apply(Integer t) {
    return MyClass.value(t);
  }
}

Два раза использовали ссылку, получили два класса. Сравниваешь их, а они не равны. Что правильно, это же разные классы. А вот логично было бы иметь возможность писать f1 == f2 и получать true. Если б это были и правда ссылки на методы. Вот такая фигня, малята.

 

Перейти на