在控制流中§
有关 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。