Eiffel: есть ли способ указать различные типы для параметра - PullRequest
0 голосов
/ 11 октября 2018

Есть ли способ ограничить соответствие типа коллекцией типов?

Позвольте мне объяснить на примере:

give_foo (garbage: ANY): STRING
    do
        if attached {STRING} garbage as l_s then
            Result := l_s
        elseif attached {INTEGER} garbage as l_int then
            Result := l_int.out
        elseif attached {JSON_OBJECT} garbage as l_int then
            Result := l_int.representation
        elseif attached {RABBIT} garbage as l_animal then
            Result := l_animal.name + l_animal.color
        else
            Result := ""
            check
                unchecked_type_that_compiler_should_be_able_to_check_for_me: False
            end
        end
    end

Не могу ли я сделать что-то вроде (как функция преобразования может сделать)

give_foo (garbage: {STRING, INTEGER, JSON_OBJECT, RABBIT}): STRING
    do
        if attached {STRING} garbage as l_s then
            Result := l_s
        elseif attached {INTEGER} garbage as l_int then
            Result := l_int.out
        elseif attached {JSON_OBJECT} garbage as l_int then
            Result := l_int.representation
        elseif attached {RABBIT} garbage as l_animal then
            Result := l_animal.name + l_animal.color
        else
            Result := ""
            check
                unchecked_type_that_compiler_should_be_able_to_check_for_me: False
            end
        end
    end

или что-то вроде

not_garbage_hash_table: HASH_TABLE[{INTEGER, STRING, ANIMAL}, STRING]

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Возможно поместить решение Александра в запрос BOOLEAN, чтобы его можно было повторно использовать?

is_string_integer_or_json_object (v: detachable ANY): BOOLEAN
         -- Does `v' conform to {STRING}, {INTEGER}, or {JSON_OBJECT}?
    do
       across {ARRAY [TYPE [detachable ANY]]}
        <<{detachable STRING}, {INTEGER}, {detachable JSON_OBJECT}>> as t
       some v.generating_type.conforms_to (t.item) end
    end
0 голосов
/ 11 октября 2018

Соответствие коллекции типов не поддерживается по нескольким причинам:

  • Вызов функции для выражения такого типа становится неоднозначным, поскольку одно и то же имя может относиться к совершенно не связанным функциям.
  • В одном случае нам нужна сумма (непересекающееся объединение) типов, во втором - простое объединение, в третьем - пересечение и т. Д. И затем могут быть комбинации.Требуется алгебра, построенная поверх системы типов, которая становится слишком сложной.
  • Если необходимо проверить, является ли аргумент одним из ожидаемых типов, можно использовать следующее предварительное условие:

    across {ARRAY [TYPE [detachable ANY]]}
            <<{detachable STRING}, {INTEGER}, {detachable JSON_OBJECT}>> as t
    some argument.generating_type.conforms_to (t.item) end
    
  • Распространенной практикой обработки выражения потенциально неизвестного типа является шаблон посетителя, который работает с известными случаями и возвращается к значению по умолчанию для неизвестных.
...