Eiffel: классическая структура переключателя приведения типов с присоединением и проверкой

Как лучше всего сделать что-то вроде

local
    l_pet: ANIMAL
do
    l_pet := catch_it_from_the_sky
    inspect l_pet
    when attached {DOG} l_pet as l_dog
        l_dog.eat (meat)
    when attached {FISH} l_pet as l_fish
        l_fish.eat (plants)
    else
        io.put_string ("Strange animal how do I feed him???")
    end
do

компилятор жалуется на attached после, когда...

Обновление: зачем такая необходимость?

потому что так случилось, что я запутался с повторяющимся копированием-вставкой, чего язык пытается избежать. В приведенном выше случае l_pet записывается один раз, с N раз, если/иначе мне пришлось бы писать столько же раз, сколько если...


person Pipo    schedule 12.10.2018    source источник
comment
На stackexchange отсутствует кнопка «большой палец» с надписью «забавный пример», надеюсь, вам понравится меня читать ;-)   -  person Pipo    schedule 12.10.2018


Ответы (2)


Оператор inspect позволяет проверить, имеет ли выражение конкретное значение, и может применяться к выражениям целочисленных типов (например, INTEGER_64, CHARACTER_32 или NATURAL_8):

inspect age
when 6 .. 16 then ...
when 18 then ...
when 80, 90 then ...
...
end

Для различения типов объектов используются условные инструкции:

if attached {DOG} pet as dog then
   dog.eat (meat)
elseif attached {FISH} pet as fish then
   fish.eat (plants)
else
   io.put_string ("Strange animal how do I feed him???")
end
person Alexander Kogtenkov    schedule 12.10.2018

В многоотраслевой инструкции

inspect exp when ... then ... else ... end

Выражение exp должно быть символьным или целочисленным выражением.

В приведенном вами примере я не вижу необходимости делать это Object-Test, но если вам нужно сделать что-то подобное, вам нужно использовать условную инструкцию.

if ... then ... elseif ... then ... else ... end

person javierv    schedule 12.10.2018