在控制流中§
有关 with orwith without,请参见主要文档 in context
with
语句类似于 if
,但它测试的是定义性而不是真值,并且它对条件进行主题化,这与 given
非常相似
with "abc".index("a") # prints 0
与 elsif
类似,orwith
可用于链接定义性测试
# The below code says "Found a at 0"my = "abc";with .index("a")orwith .index("b")orwith .index("c")else
您可以混合使用基于 if
和基于 with
的子句。
# This says "Yes"if 0 orwith Nil orwith 0 ;
与 unless
一样,您可以使用 without
来检查未定义性,但您不能添加 else
子句
my = Any;without
还有 with
和 without
语句修饰符
my = (Any, True).roll;say 42 with ;warn "undefined answer" without ;
与其他可链接的结构一样,完成 with/if
..orwith/elsif
链的 else
本身将对前一个(失败的)条件主题的值进行主题化(with
的主题或最终的 orwith
或 elsif
)。
在 with
或 orwith
之后的 else
的情况下,对保证未定义的值进行主题化似乎毫无用处。但当与可能失败的操作结合使用时,它会形成一个有用的习惯用法,因为 Failure
值始终未定义
sub may_fail( --> Numeric )with may_fail() ->else
请注意,虽然对 Failure
进行主题化会将其标记为 handled
——因此您可以使用 with
/else
安全地继续执行——但这并不会使 Failure 值本身 变得安全。即使在 else
子句中,如果您尝试直接使用该值,也会导致您的 else
子句本身失败(或者在 Rakudo 中,“提升”Failure 成为抛出的异常)。
但如上所见,您可以 使用 else
主题化的已处理 Failure
对象的方法,例如 exception
,如果您希望提供诊断或询问底层 Exception
。