Почему LINKED_SET не может сравнивать объекты?

Поскольку я хотел бы знать, входит ли какой-либо объект в LINKED_SET, чтобы обрезать его в моем контексте, я не могу сравнить его как объект, а не как ссылку.

changeable_comparison_criterion: BOOLEAN
        -- May `object_comparison' be changed?
        -- (Answer: only if set empty; otherwise insertions might
        -- introduce duplicates, destroying the set property.)
    do
        Result := is_empty
    ensure then
        only_on_empty: Result = is_empty
    end

В классе SET (как указано выше) кажется, что невозможно изменить набор на compare_objects. Итак, мои вопросы:

  1. Какова семантика невозможности сравнивать объекты в SET
  2. Если мой выбор LINKED_SET неверен из-за непонимания его семантики, что мне делать, чтобы иметь коллекцию уникальных элементов на основе сравнения объектов, а затем иметь возможность снова обрезать элемент на основе сравнения объектов снова

person Pipo    schedule 13.11.2019    source источник


Ответы (1)


Критерий сравнения нужно задавать сразу после создания контейнера, тогда все работает без проблем. Если какие-то объекты в наборе уже есть, становится непонятно, что с ними делать, если критерий сравнения изменится.

Например, если имеется множество {A, B} двух различных объектов A и B, имеющих одинаковое значение, т. е. равных, что делать, если критерий сравнения изменится с compare_references на compare_objects? Понятно, что в наборе теперь должен быть только один объект, потому что согласно новой настройке он не может содержать два и более одинаковых объекта. Значит ли это, что объект А нужно удалить, а Б оставить? Или это нужно делать в обратном порядке? Предварительное условие, на которое вы ссылаетесь, устраняет эту двусмысленность.

Решение состоит в том, чтобы изменить настройку до того, как в контейнере появятся какие-либо объекты:

create my_set.make
my_set.compare_objects
person Alexander Kogtenkov    schedule 13.11.2019