埃菲尔铁塔:古典式压铸开关结构,附带并检查

时间:2018-10-12 15:31:35

标签: casting switch-statement 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次,而我不得不将其写入次数就好像……一样。

2 个答案:

答案 0 :(得分:1)

inspect语句允许检查表达式是否具有特定值,并且可以应用于整数类型的表达式(例如INTEGER_64CHARACTER_32NATURAL_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

答案 1 :(得分:1)

在多分支指令中

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

exp表达式必须是字符或整数表达式。

在您给出的示例中,我认为没有必要这样做Object-Test, 但是如果您需要执行类似操作,则需要使用条件指令。

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