Почему в Scala нет разумного равенства между анонимными типами? - PullRequest
2 голосов
/ 24 апреля 2011

Рассмотрим этот код:

val a = new { val x = 1; val y = 2 }
val b = new { val x = 1; val y = 2 }

a == b // false

Не было бы разумно, если бы у анонимных классов было определенное равенство, которое возвращало бы true, если поля / методы / значения совпадают?

Я полагаю, что это может также уменьшить количество файлов классов, которые Scala должен генерировать в определенных случаях использования.

(Насколько я знаю, C # использует один и тот же класс для анонимных типов, если они имеют одинаковые значения в том же порядке и возвращает true, когда они сравниваются друг с другом.)

1 Ответ

11 голосов
/ 24 апреля 2011

Поскольку во всех случаях трудно сделать правильные вещи.

Как правило, в ОО-языках равенство имеет смысл только между экземплярами одного и того же класса.Когда вы используете анонимные классы, как в вопросе, у вас фактически есть два разных класса, которые выглядят одинаково.

Рассмотрим (в псевдокоде):

class Point {
    int x;
    int y;
}

class Dimensions {
    int x;
    int y;
}

class Rectangle {
    Point lowerLeftCorner;
    Dimensions dimensions;   
}

ЗдесьТочка никогда не должна сравниваться равной Измерениям, даже если они имеют одинаковые значения x и y.Но две точки с одинаковыми значениями x и y должны сравниваться равными.

В вашем примере, как магически узнать язык, если вы предполагаете, что два разных анонимных класса имеют одинаковое значение или нет?Концептуально это могут быть две точки, или точка и измерения.

(Я не согласен с тем, что система C # лучше: во-первых, она не знает, что ваши анонимные классы должны были быть сравнимыми, а во-вторых, яна самом деле не понимаю, почему порядок должен влиять на вещи. Во всех других случаях порядок полей класса не имеет значения, почему он должен иметь значение здесь?)

...