24 May 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.

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 中的注释:<!-- -->, 这时候我们就要用 circumfix
    sub circumfix:«<!-- -->» ($text) { ... }

You should know

What I said is a part of Perl6.


blog comments powered by Disqus