3

我正在尝试同时使用 Perl 的自动装箱功能和运算符重载功能,但它们似乎并没有协同工作。

是否有可能我错过了如何正确使用重载的一些细微差别,或者这是某种奇怪的异常行为?

示例代码:

#!/usr/bin/perl
use strict;
use warnings;

package overload_me;
use overload('+' => "overloaded_add");
sub overloaded_add{
    my ($me, $him) = @_;
    $me+$him+1;
}

use autobox NUMBER => 'overload_me';
my $autoboxing_test = 4->overloaded_add(5);
my $overloading_test = 4 + 5;
print "Autoboxing test: 4+5=$autoboxing_test 
Overloading test: 4+5=$overloading_test\n";

测试输出:

Autoboxing test: 4+5=10 Overloading test: 4+5=9
4

1 回答 1

6

自动装箱不会导致4成为overload_me. 它导致方法调用4其左侧调用方法overload_me。这是一个微妙但重要的区别,因为这意味着overload根本不适用。4不是对象,也不属于任何类。它仍然是公正的4,当你计算时4 + 5它仍然是公正的4 + 5

自动框文档

自动装箱是透明的:装箱的值不会被祝福到它们的(用户定义的)实现类中(除非方法选择赋予这样的祝福)——它们只是像使用它的方法一样使用它的方法。

于 2011-02-28T01:23:42.013 回答