Eiffel:或和中的局部声明编译失败
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
更新
因为这似乎是一个有效的表达式,我认为如果在我的 或 的每个分支中都声明了一个 l_int
我应该能够在 然后范围。
但是这个表达式似乎是有效的
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
首先,您不能对同一范围内的多个对象测试局部变量使用相同的标识符 (l_int)。
对象测试有范围。用 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
。因此对于析取,作用域为空,不能在任何分支中使用对应的对象test local
如果一个条件中有两个对象测试,它们的范围可能重叠也可能不重叠:
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
的对象test局部变量的作用域是A
。另外,对于and then
,范围包括OT2
,特别是OT2
可以使用OT1
的局部。同理,OT2
不能使用OT1
.
的同一个对象test local
对于析取,OT1
和OT2
的object test locals的范围都是空的。为了提供更多信息,具有助记名称的相同代码如下所示:
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_64
和 INTEGER_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
...
但这变得太麻烦了,使用多个分支或临时局部变量看起来是更好的选择。
编译器抱怨未知标识符,似乎它无法识别我的多个声明中的任何一个,我哪里错了?
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
更新
因为这似乎是一个有效的表达式,我认为如果在我的 或 的每个分支中都声明了一个 l_int
我应该能够在 然后范围。
但是这个表达式似乎是有效的
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
首先,您不能对同一范围内的多个对象测试局部变量使用相同的标识符 (l_int)。
对象测试有范围。用 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
。因此对于析取,作用域为空,不能在任何分支中使用对应的对象test local
如果一个条件中有两个对象测试,它们的范围可能重叠也可能不重叠:
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
的对象test局部变量的作用域是A
。另外,对于and then
,范围包括OT2
,特别是OT2
可以使用OT1
的局部。同理,OT2
不能使用OT1
.
对于析取,OT1
和OT2
的object test locals的范围都是空的。为了提供更多信息,具有助记名称的相同代码如下所示:
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_64
和 INTEGER_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
...
但这变得太麻烦了,使用多个分支或临时局部变量看起来是更好的选择。