Category: Perl6 Keywords: Operator overloading Perl6
Description
关于操作符重载的笔记。Details
操作符只是带有特殊名字的子程序。我们这里对上一章 multi sub Examples (6, Perl6) {...} 里介绍的 multi sub 的例子用操作符重新写一次:multi sub infix:<(+)> (Num $a, Num $b) { return $a + $b; }
multi sub infix:<(+)> (Str $a, Str $b) { return $a ~ $b; }
multi sub infix:<(+)> ($a, $b) { return $a ~ '-' ~ $b; }
say 1 (+) 2; # 3
say 'a' (+) 'b'; # ab
say 0 (+) 'a'; # 0-a
这里唯一需要介绍的是 infix 的意思。
(pre|in|post|circum)fix
操作符我们分为一元操作符和二元操作符,当然还有三元和 circumfix/圆周型。- 一元操作符按操作符在前在后分为两种,分别对应 prefix 和 postfix
sub prefix:<(+)> ($a) { return "pre~$a~"; } sub postfix:<(+)> ($a) { return "~$a~post"; } say (+) 2; # pre~2~ say 2 (+); # ~2~post - 二元操作符只能放中间,所以我们用 infix. 就是最前面的例子中所用的。
二元操作符中有个特性,可以用 is commutative 定义成可交换的。如:multi sub infix:<(+)> (Str $a, Num $b) is commutative { return "$a-$b"; } say 0 (+) 'a'; # 0-a say 'a' (+) 0; # a-0这样不管前后顺序,只要有一个是 Str 有一个是 Num 就可以了。 - 还有种圆周型操作符。最常见的是 HTML 中的注释:
<!-- -->, 这时候我们就要用 circumfixsub circumfix:«<!-- -->» ($text) { ... }