Eiffel: классическая структура переключения типов с прикрепленным и проверяющим - PullRequest
0 голосов
/ 12 октября 2018

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

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 раз, если / иначе мне придется записывать столько раз, сколько если бы ...

Ответы [ 2 ]

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

В инструкции с несколькими ветвями

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

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

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

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

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

Оператор 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
...