首页 文章

子集块(或一般的Callables)

提问于
浏览
5

question was originally posted by lookatme in the Perl6 IRC channel . 最初的意图是constrain a Callable by using subsets或任何其他可能的方式 . 它适用于签名,但是:

subset WalkCb of Callable where *.signature ~~ :(Int $a); 
my WalkCb $x = sub (Int $a) { return $a; };

回报

«Type check failed in assignment to $x; expected WalkCb but got Sub (sub (Int $a) { #`(Sub...)␤  in block <unit> at <tmp> line 1␤␤»

声明的其他变体返回类似的消息 . 什么是正确的语法?

2 回答

  • 7

    在这种情况下,似乎解析了 WhateverCode . 所以如果你在 where 中指定一个块:

    subset WalkCb of Callable where { .signature ~~ :(Int $) }
    my WalkCb $x = sub (Int $a) { return $a; }
    

    它似乎按预期工作 . 另请注意,我删除了行末尾的 ; ,因为行末尾的 } 也是语句的结尾 . 我从签名中删除了"a":忽略了签名智能匹配中位置参数的名称 .

  • 6

    where 约束可以采用块(lambda)或语句 .

    … where { $_ == 42 }; # block
    … where    * == 42;   # lambda
    … where   $_ == 42;   # statement
    

    问题是 ~~ 没有参与WhateverCode lambdas的创建( *
    所以你真正在做的是在更大的 where statement (而不是lambda)中创建 *.signature 的lambda .

    constant $lambda = *.signature;
    subset WalkCb of Callable where $lambda ~~ :(Int $);
    

    哪个当然永远不会返回 True ,因为lambda具有 :(;; $ is raw) 的签名


    所以只需编写声明表单 . (使用隐式 $_

    subset WalkCb of Callable where .signature ~~ :(Int $);
    my WalkCb $x = sub (Int $a) { return $a }
    say $x(42); # 42␤
    

相关问题