我们如何在子例程中指定Callable参数的属性

时间:2018-12-09 09:54:58

标签: signature perl6

  

这来自this perl6/doc issue,也指these questions in the IRC channel

documentation指定如何使用Signature literal约束可调用对象的参数:

sub f(&c:(Int, Str))  { say c(10, 'ten') };

(这会将函数参数限制为仅将Integer和String作为参数的函数参数。)

但是,在某些其他情况下,可以使用where约束,例如,如果需要限制Arity或返回值。但是,有没有更简单的方法或语法呢?

1 个答案:

答案 0 :(得分:7)

要强制使用例如2的整数,则也可以使用签名文字:

sub foo(&x:($,$)) {
    x(1,2)
}

然后这有效:

foo -> $a, $b { say $a + $b }

死了:

foo -> $a { say $a }

此签名文字仅表示“任何两个参数”。还可以通过类似的方式来限制返回类型:

sub foo(&x:(--> Int)) {
    say x()
}

这意味着有效:

foo sub (--> Int) { 42 }

但这死了:

foo sub () { "oops" }