繁体   English   中英

埃菲尔铁塔:或和中的本地声明和编译失败

[英]Eiffel: local declaration in or and and failed to compile

编译器抱怨一个未知的标识符,似乎它不能识别我的多个声明中的任何一个,我在哪里错?

if attached {INTEGER_REF} field.item as l_int
        or attached {INTEGER_64} field.item as l_int
        or ( attached {TUPLE} field.item as l_tuple and then attached {INTEGER_64} l_tuple.item (1) as l_int ) then
    Result.put_integer (l_int.to_integer_64, primary_key_db_column_name)
elseif attached {STRING} field.item as l_s then
    Result.put_string (l_s, primary_key_db_column_name)
end

在此处输入图片说明

更新

因为这似乎是一个有效的表达式,所以我认为,如果在my l_int每个分支中都声明了,我应该可以在then范围内使用它。

但是似乎这个表达是有效的

if attached a.b as l_b and then attached l_b.c as l_c then
    l_c.is_available_in_this_scope
    l_b.is_available_in_this_scope
else
    io.putstring ("you are wrong dear and either l_b and l_c are not available!")
end

虽然这一个不!

if attached a.b as l_b and then attached l_b.c as l_c
        or attached a.x as l_b and then attached l_x.d as l_c then
    l_c.is_available_in_this_scope -- Compiler complain about l_c
    l_b.is_available_in_this_scope -- Compiler complain about l_b
else
    io.putstring ("you are wrong dear and either l_b and l_c are not available!")
end

用我的代码

这样编译

    if attached {INTEGER_REF} field.item as l_int then
        Result.put_integer (l_int.to_integer_64, primary_key_db_column_name)
    elseif attached {INTEGER_64} field.item as l_int then
        Result.put_integer (l_int, primary_key_db_column_name)
    elseif attached {TUPLE} field.item as l_tuple and then attached {INTEGER_64} l_tuple.item (1) as l_int then
        Result.put_integer (l_int, primary_key_db_column_name)
    elseif attached {STRING} field.item as l_s then
        Result.put_string (l_s, primary_key_db_column_name)
    else
        logger.write_error ("to_json-> Type not found in matching:" + field.item.out)
        check
            not_found_item_type: False
        end
    end

虽然这不是

if attached {INTEGER_REF} field.item as l_int then
    Result.put_integer (l_int.to_integer_64, primary_key_db_column_name)
elseif attached {INTEGER_64} field.item as l_int
        or attached {TUPLE} field.item as l_tuple and then attached {INTEGER_64} l_tuple.item (1) as l_int then
    Result.put_integer (l_int, primary_key_db_column_name) -- Unknown identifier `l_int`
elseif attached {STRING} field.item as l_s then
    Result.put_string (l_s, primary_key_db_column_name)
else
    logger.write_error ("to_json-> Type not found in matching:" + field.item.out)
    check
        not_found_item_type: False
    end
end

对象测试具有范围。 OT表示对象测试,对象测试的范围

if OT         then A else B end
if OT and ... then A else B end
if OT or  ... then C else B end

只是A 因此,对于析取,作用域为空,并且您不能在任何分支中使用相应的局部对象测试。

如果条件中有两个对象测试,则它们的范围可能重叠或不重叠:

if OT1 and      OT2 then A else B end
if OT1 and then OT2 then A else B end
if OT1 or       OT2 then C else B end

在这里,和以前一样, OT1的对象测试局部变量的作用域为A 此外,对于and then ,该范围包括OT2 ,特别地, OT2可以使用本地的OT1 出于相同的原因, OT2无法使用OT1的同一对象测试本地。

为了OT2OT1OT2的对象测试OT2为空。 为了提供更多信息,带有助记符名称的相同代码如下所示:

if attached e1 as x and      attached e2_without_x as y then use_x_and_y else B end
if attached e1 as x and then attached e2_with_x    as y then use_x_and_y else B end
if attached e1 as x or       attached e2_without_x as y then no_x_no_y   else B end

如果所有涉及的表达式的类型相同 (即使不是,因为有INTEGER_64INTEGER_REF类型),仍然可能只用一个第一分支来重写示例:

if attached
       if attached {INTEGER_64_REF} field.item as i then
           i
       elseif
           attached {TUPLE} field.item as t and then
           t.count > 0 and then
           attached {INTEGER_64_REF} t.item (1) as i
       then
           i
       else
           Void
       end
   as j
then
   -- Use j
...

但这变得太麻烦了,使用多个分支或临时局部变量似乎是更好的选择。

首先,您不能对同一作用域中的多个对象测试局部变量使用相同的标识符(l_int)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM