gpt4 book ai didi

signature - 子集 block (或一般的可调用对象)

转载 作者:行者123 更新时间:2023-12-02 23:18:14 25 4
gpt4 key购买 nike

这个question was originally posted by lookatme in the Perl6 IRC channel 。初衷是constrain a Callable通过 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␤␤»

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

最佳答案

where 约束可以采用 block (lambda) 或语句。

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

问题是 ~~ 不参与WhateverCode lambdas (*)的创建
因此,您真正要做的是在更大的 where 语句 内创建一个 *.signature 的 lambda(不是 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␤

关于signature - 子集 block (或一般的可调用对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50384890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com