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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |