signature - 子集块(或一般的可调用对象)
问题描述
这个问题最初是由lookatme
Perl6 IRC 频道发布的。最初的意图是通过使用子集或任何其他可能的方式来约束 Callable 。它适用于签名,但是:
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
采用块 (lambda) 或语句。
… where { $_ == 42 }; # block
… where * == 42; # lambda
… where $_ == 42; # statement
问题是它~~
不参与 WhatCode lambdas ( *
)的创建
所以你真正在做的是*.signature
在一个更大的where
语句(不是 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
推荐阅读
- node.js - 是否可以在运行其他一些代码的同时执行 while 循环?
- javascript - 反应,我如何在反应中使用 face-api 作为一个普通的 javascript 函数来从照片中检测人脸?
- google-sheets - 获取谷歌表格一列中对应的非空相邻单元格
- javascript - 使用附加的 Excel 电子表格中的数据填充 PDF 表单字段
- asp.net - 编辑 Gridview 更新问题
- typescript - vscode emmet 不自动提示
- html - 设置登录详细信息
- python - 按客户顺序遍历 Python 字典 - 每行而不是每键
- git - 如何修复 git repo 以删除已存在的文件夹的 update_ref 错误?
- java - 如何自动构造java类源代码?