Объектные тесты имеют границы.Обозначая объектный тест 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
.
. Для дизъюнкции области локальных объектов объектного теста OT1
и 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_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
...
, но это становится слишком громоздким, и использование нескольких ветвей или временных локальных переменных выглядит каклучшая альтернатива.