You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用subset约束Callable类型?赋值类型检查错误求解

如何正确用subset约束Perl 6的Callable类型

你遇到的问题是因为subset的where子句写法有误,导致无法正确匹配Callable的签名。咱们一步步来看解决方案:

问题根源

你原来的代码里,where *.signature ~~ :(Int $a)这个条件写法不对。*.signature是一个WhateverCode(相当于匿名函数-> $x { $x.signature }),但这里where子句需要的是针对当前待检查的Callable对象,直接判断它的signature是否匹配,而不是把一个代码对象和签名做比较。

正确写法一:精确检查签名

把where子句改成针对当前对象的signature做判断,用块或者直接调用方法:

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

或者更简洁的写法(where子句默认以$_指代当前对象):

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

这样就能正确约束WalkCb是接受一个Int类型参数的Callable了。

正确写法二:利用Callable的类型参数(更简洁)

如果不需要精确匹配参数名,只是约束参数类型和返回类型,Perl 6提供了更便捷的Callable[ReturnType, *@ParameterTypes]语法:

# 第一个Int是返回值类型,第二个Int是参数类型(表示接受一个Int参数)
subset WalkCb of Callable[Int, Int];
my WalkCb $x = sub (Int $a) { return $a; };

这种写法更符合Perl 6的类型系统习惯,代码也更简洁。

验证效果

上面两种写法运行后都不会再报类型检查错误,能正确将符合签名的Sub赋值给$x变量。

内容的提问来源于stack exchange,提问作者jjmerelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:15:31