Eiffel: операторы приведения типов. В чем разница между ~ / и прикрепленными операторами? - PullRequest
0 голосов
/ 31 октября 2018

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

  • объект теста

    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 голосов
/ 01 ноября 2018

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

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

  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).

...