我有一个具有新方法的类,并使用该对象调用方法X.当我从对象调用X时,参数的第一个值是$ self,其余的是我发送的值。现在当我从对象上的另一个方法调用相同的方法,第一个值不再是$ self,而只是发送的值。如何解决这种情况?
样品:
my $p = TEST->new;
$p->mymethod(1,2,3); # @_ = 'self, 1, 2, 3'
但如果在'mymethod'中被其他方法调用:
sub anothermethod{
my ($self, $a) = @_;
mymethod(1,2,3); # @_ = '1,2,3'
}
如何编写'mymethod'以便处理这两种情况?或者我从根本上做错了什么?
答案 0 :(得分:9)
就像你这样做:
$p->mymethod(1,2,3);
你需要明确你正在调用方法的对象(甚至是在类中):
$self->mymethod(1,2,3);
答案 1 :(得分:2)
这不是一个好主意(你应该决定子程序是否是一种方法,并以一致的方式使用它),但在弱点时刻,我使用了如下结构:
sub subroutine_that_may_get_called_like_a_method {
shift if ref $_[0] eq __PACKAGE__;
my ($param1, $param2) = @_;
...
}
sub method_that_may_get_called_like_a_subroutine {
unshift @_, __PACKAGE__ if ref $_[0] ne __PACKAGE__
my ($self, $param1, $param2) = @_;
...
}
通常我只能盯着这个代码几个小时才能在我的肠道中羞辱池,我必须解决它。