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

Perl 6是否有例程调用的中缀版本?函数数组如何应用于对象数组?

解决Perl 6中函数数组与对象数组的配对调用问题

我明白你遇到的痛点:想用中缀方式把函数数组和对象数组一一配对调用,但Z.会被解析器误判为字符串连接运算符导致报错。下面给你几个简洁的解决方案:

方案1:使用Z&运算符(最简洁)

Perl 6内置了Z&这个专门的中缀运算符,它的作用就是把左侧列表的元素和右侧列表的函数一一配对,然后自动调用函数处理元素,完美契合你的需求:

my $a = sub ($) { $_ * 2 };
my $b = sub ($) { $_ / 2 };
my @funcs = ($a, $b);
my @ops = @funcs.roll(4);

# 直接用Z&实现配对调用
say ^10 Z& @ops;

如果你的对象数组长度比函数数组长,想循环使用函数数组的话,可以加上.cycle:

# 循环使用@ops中的函数处理^10的所有元素
say ^10 Z& @ops.cycle;

Z&等价于手动做zip后再map调用函数:(^10 Z @ops).map: { $_[0].&$_[1] },但写法更简洁直观。

方案2:用块作为Z的中缀逻辑

如果想更明确控制调用逻辑,可以自定义一个块作为Z的中缀运算符,可读性更强:

say ^10 Z -> $elem, $func { $elem.&$func } @ops;
# 或者更短的写法
say ^10 Z { .&$^b } @ops;

为什么Z.会报错?

Perl 6中.运算符有两个作用:一是方法调用(优先级很高),二是字符串连接(当左右是字符串类对象时)。当你写^10 Z. @ops时,解析器会错误地将Z.识别为无效运算符,或者把.当成字符串连接来处理——但Range和Array不能做字符串连接,因此抛出错误。而Z&明确告诉解析器:我们要做的是函数调用的配对操作,彻底避免了歧义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:38:49