Эйфель: операторы приведения типов в чем разница между ~ / и прикрепленными операторами?

Какая разница между

  • объектный тест

    if attached {DOG} an_animal as a_dog then
       a_dog.eat (meat)
    end
    
  • оператор / класса TYPE

    if an_animal / a_dog then
       an_animal.eat (food)
    end
    
  • эталонное равенство =

    if a_dog = an_animal then
        a_dog.eat (meat)
    else
        an_animal.eat (food) 
    end
    
  • равенство объектов ~

    if a_dog ~ an_animal then
        a_dog.eat (meat)
    else
        an_animal.eat (food) 
    end
    

И где мне найти документацию по этому поводу?

1
0
380
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основные различия между конструкциями заключаются в типах операндов и семантике.

  1. Объектный тест позволяет выяснить, соответствует ли конкретное выражение значению, соответствующему определенному типу. Значение соответствующего объекта может быть получено через связанный объект test local.

  2. Оператор / класса 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
    
  3. Равенство ссылок = сравнивает (большую часть времени) ссылки на объекты и не имеет ничего общего с их типами. Другими словами, a = b для ссылочных объектов означает, что a и b являются псевдонимами. Если один из операндов является развернутым объектом, = совпадает с равенством объектов (см. Ниже).

    Если выражение dog = animal возвращает True, переменные dog и animal ссылаются на один и тот же объект, но мы понятия не имеем, что это за тип.

  4. Равенство объектов ~ сравнивает содержимое двух объектов. Сначала он проверяет, что оба они недействительны, имеют один и тот же тип, а затем вызывает (определяемый пользователем) предикат is_equal для получения результата оператора.

    Если выражение dog ~ animal возвращает True, переменные dog и animal могут быть одинаковыми или разными объектами, которые имеют один и тот же тип и равны (согласно is_equal). Как и в предыдущем случае, мы понятия не имеем, что это за тип.

1, 3 и 4 задокументированы в языковом стандарте, 2 - это функция класса TYPE (с соответствующим именем attempted).

Другие вопросы по теме