gpt4 book ai didi

raku - 如何从 block 的CATCH相位器返回值?

转载 作者:行者123 更新时间:2023-12-04 03:42:04 26 4
gpt4 key购买 nike

从非例程的块中从CATCH相位器返回值的语法是什么?

sub foo() {
<1 2 3>.map: -> $a {
die 'oops';
CATCH { default { 'foo' } }
}
}

sub bar() {
<1 2 3>.map: -> $a {
die 'oops';
CATCH { default { return 'bar' } }
}
}

say foo(); # (Nil, Nil, Nil)
say bar(); # Attempt to return outside of immediatelly-enclosing Routine (i.e. `return` execution is outside the dynamic scope of the Routine where `return` was used)

编辑:所需的输出是:
say baz(); # (baz baz baz)

用例是 map用一种间歇性抛出异常的方法对 Seq进行编码,并通过返回默认值来处理传递给map的块中的异常。

最佳答案

Return退出功能范围,但是在bar()中使用它的方式有两个作用。

  • bar()方法本身。
  • 您将返回值嵌入其中的lambda。

  • 这意味着您的返回是模棱两可的(至少对于某些人而言如此),并且编译器将不知所措。

    如果没有“返回”, foo()中的值将在该块内作为常量处理,并且该块返回Nil。这意味着在 foo()中,您可以有效地避免解析 return的含义,从而有效地将 Nil压入堆栈。

    这就是为什么在 Nil的捕获输出中有3 foo()的原因。对于 bar(),不清楚是要在第一个抛出的异常时终止 bar()例程的执行,还是只想将 'bar'作为CATCH块压入堆栈的非 Nil值传递回去。

    您的代码略有修改的版本
    #!/bin/env perl6

    sub foo() {
    <1 2 3>.map: -> $a {
    die 'oops';
    }
    CATCH { default { 'foo' } }
    }

    sub bar() {
    <1 2 3>.map: -> $a {
    die 'oops';
    }
    CATCH { default { return 'bar' } }
    }

    say foo();

    say bar();

    可能会使这一点更加清楚。它的输出是
    [edwbuck@phoenix learn_ruby]$ ./ed.p6 
    Nil
    bar

    关于raku - 如何从 block 的CATCH相位器返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49890043/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com