加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

return-value – 明确命名的返回值?

发布时间:2020-12-15 23:22:41 所属栏目:大数据 来源:网络整理
导读:在Go( and G++?)中,以下是一个常见的习语: func sqr(x int) (n int,err error) { n = x * x err = nil return} (n int,err error)显式枚举返回值的名称和类型.在我看来,这有很多优点,我喜欢它. 在Perl 6中,我们可以: my sub sqr (Int:D $x) returns Int:D
在Go( and G++?)中,以下是一个常见的习语:

func sqr(x int) (n int,err error) {
    n = x * x
    err = nil
    return
}

(n int,err error)显式枚举返回值的名称和类型.在我看来,这有很多优点,我喜欢它.

在Perl 6中,我们可以:

my sub sqr (Int:D $x) returns Int:D {
    $x ** 2;
}

返回是隐式的,这让我有点不舒服(我们可以通过返回使其明确),但您可能会注意到指定了返回类型(因为它是定义的事实).

不出所料,没有明显的方法可以通过名称显式返回值,但我很好奇,因为Perl(特别是6)在各方面都可以进行广泛修改,如果有办法实现这个.

1然而,它可能是hacky,但太过于hacky而且我会避免将它用于“真实”的东西.

解决方法

如果一切都失败了,你总是可以写自己的俚语.

但是,这里有两个涉及的方法较少,第一个使用固定名称的动态变量,第二个使用用户定义名称的rw参数:

multi sub trait_mod:<is>(Routine:D r,:$dynrv!) {
    r.wrap(-> | { my $*rv; callsame; $*rv })
}

multi sub trait_mod:<is>(Routine:D r,:$pararv!) {
    r.wrap(-> |c { my $rv; callwith(|c,$rv); $rv })
}

sub double($x) is dynrv {
    $*rv = $x * 2;
    return 666; # discarded
}

sub triple($x,$y is rw) is pararv {
    $y = $x * 3;
    return 666; # discarded
}

say double 42;
say triple 42;

请注意,这只支持单个返回值,但我有一些想法可以使多个可以工作…

编辑:例如这样:

multi sub trait_mod:<is>(Routine:D r,:@dynrv!) {
    r.wrap(-> | {
        my @rv = Nil xx @dynrv;
        my $*rv = Map.new(@dynrv Z=> @rv);
        callsame;
        @dynrv > 1 ?? @rv !! @rv[0];
    })
}

multi sub trait_mod:<is>(Routine:D r,Int :$pararv!) {
    r.wrap(-> |c {
        my @rv = Nil xx $pararv;
        callwith(|c,|@rv);
        $pararv > 1 ?? @rv !! @rv[0];
    })
}

sub divmod($a,$b) is dynrv<d m> {
    $*rv<d> = $a div $b;
    $*rv<m> = $a mod $b;
}

sub plusmin($a,$b,$p is rw,$m is rw) is pararv(2) {
    $p = $a + $b;
    $m = $a - $b;
}

say divmod 14,3;
say plusmin 14,3;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读