Eiffel: есть ли способ указать различные типы для параметра
Есть ли способ ограничить соответствие типа как коллекции типов?
Позвольте мне объяснить на примере:
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 ответа
Решение
Соответствие коллекции типов не поддерживается по нескольким причинам:
- Вызов функции в выражении такого типа становится неоднозначным, поскольку одно и то же имя может относиться к совершенно не связанным функциям.
- В одном случае нам нужна сумма (непересекающееся объединение) типов, во втором - простое объединение, в третьем - пересечение и т. Д. И тогда могут быть комбинации. Требуется алгебра, построенная поверх системы типов, которая становится слишком сложной.
Если необходимо проверить, является ли аргумент одним из ожидаемых типов, можно использовать следующее предварительное условие:
across {ARRAY [TYPE [detachable ANY]]} <<{detachable STRING}, {INTEGER}, {detachable JSON_OBJECT}>> as t some argument.generating_type.conforms_to (t.item) end
- Обычной практикой обработки выражения потенциально неизвестного типа является шаблон посетителя, который работает с известными случаями и возвращается к значению по умолчанию для неизвестных.
Возможно, поместите решение Александра в 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