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
相关产品推荐
相关产品推荐

