是否有一个简写,其中<or>"一个多一个位置"与多重签名中的"类型"匹配



我有这个;

multi sub infix:<+> ( Measure:D $left, Measure:D $right ) is equiv( &infix:<+> ) is export { 
my ( $result, $argument ) = inf-prep( $left, $right );
return $result.add( $argument );
}
multi sub infix:<+> ( Measure:D $left, $right ) is equiv( &infix:<+> ) is export { 
my ( $result, $argument ) = inf-prep( $left, $right );
return $result.add( $argument );
}
multi sub infix:<+> ( $left, Measure:D $right ) is equiv( &infix:<+> ) is export { 
my ( $result, $argument ) = inf-prep( $left, $right );
return $result.add( $argument );
}

是否有避免三个多子声明的速记 - 这里的主要目的是捕获具有我的自定义类型(即度量(的任何内容。

在签名中,您可以对所有参数使用单个 Capture,并使用where子句约束它们,以检查捕获中所需数量的位置以及是否存在 Type。

例如,以下子期望两个位置,其中至少一个位置Int:D:

sub callWithInt(|c where { .elems == 2 && .list.any ~~ Int:D }) {
# Just show the first Int:D received
"called with {c.list.first(* ~~ Int)}".say
}

如果需要使用相同的签名定义不同的 sub,为避免重复子句,请先创建一个subset并将其用作约束:

subset hasInt of Capture where {
.elems == 2 # Number of required positionals
&& .list.any ~~ Int:D # a Junction for the Type check
# Avoid LTA error messages
or fail('Need 2 positionals with an Int')
};
sub cwInts(hasInt |c) {
"called with {c.list.first(* ~~ Int)}".say
}
sub adder(hasInt |c) { … }
cwInts(1, 'bar'); # "called with 1"
cwInts('foo', 3); # "called with 3"
cwInts('foo', 'barr') # Error! "I need 2 positionals with an Int"
cwInts(8); # Error!

最新更新