Основные различия между конструкциями заключаются в типах и семантике операндов.
Тест объекта позволяет выяснить, оценивает ли конкретное выражение значение, соответствующее определенному типу. Значение соответствующего объекта можно получить с помощью локального теста связанного объекта.
Оператор /
класса TYPE
возвращает значение переданного аргумента, если оно соответствует типу, указанному в объекте типа. В противном случае он возвращает Void
для ссылочного типа и значение по умолчанию для расширенного типа. Это очень похоже на объектное тестирование, но имеет небольшие отличия. По сути, выражение {SOME_TYPE} / expression
эквивалентно
if attached {SOME_TYPE} expression as value then
value
else
{detachable SOME_TYPE}.default
end
Для ссылочных типов проверка объекта attached {SOME_TYPE} expression as value
эквивалентна
attached ({SOME_TYPE} / expression) as value
Но нет эквивалента для расширенных типов.
Основное использование оператора /
заключается в получении значения определенного типа, если это возможно, или Void
в противном случае:
x := {SOME_TYPE} / expression
Равенство ссылок =
сравнивает (в большинстве случаев) ссылки на объекты и не имеет ничего общего с их типами. Другими словами, a = b
для ссылочных объектов означает, что a
и b
являются псевдонимами. Если один из операндов является расширенным объектом, =
совпадает с равенством объектов (см. Ниже).
Если выражение dog = animal
возвращает True
, переменные dog
и animal
ссылаются на один и тот же объект, но мы не знаем, какой это тип.
Равенство объектов ~
сравнивает содержимое двух объектов. Сначала он проверяет, что оба являются недействительными, имеют одинаковый тип, а затем вызывает (определяемый пользователем) предикат is_equal
, чтобы получить результат оператора.
Если выражение dog ~ animal
возвращает True
, переменные dog
и animal
могут быть одинаковыми или разными объектами одинакового типа и равными (согласно is_equal
). Как и в предыдущем случае, мы понятия не имеем, к какому типу они относятся.
1, 3 и 4 задокументированы в языковом стандарте, 2 - особенность класса TYPE
(с соответствующим названием attempted
).