2 Stimmen

Wie kann ich in Perl sicherstellen, dass ein Sub als Methode von Methoden desselben Objekts aufgerufen wird?

Ich habe eine Klasse, die eine neue Methode hat und dieses Objekt verwendet, um Methode X aufzurufen. Wenn ich X aus dem Objekt aufrufe, ist der erste Wert der Parameter $self und der Rest sind die Werte, die ich gesendet habe. Wenn ich nun dieselbe Methode von einer anderen Methode des Objekts aus aufrufe, ist der erste Wert nicht mehr $self, sondern es werden nur noch die Werte gesendet. Wie kann ich diese Situation lösen?

Beispiel:

my $p = TEST->new;
$p->mymethod(1,2,3);  # @_ = 'self, 1, 2, 3'

aber wenn in 'mymethod' von einer anderen Methode aufgerufen wird:

sub anothermethod{
  my ($self, $a) = @_;
  mymethod(1,2,3);  # @_ = '1,2,3'  
}

Wie schreibe ich "mymethod" so, dass es beide Situationen behandelt? Oder mache ich etwas grundlegend falsch?

8voto

stevenl Punkte 6696

So wie Sie dies getan haben:

$p->mymethod(1,2,3);

müssen Sie explizit angeben, für welches Objekt Sie die Methode aufrufen (auch innerhalb der Klasse):

$self->mymethod(1,2,3);

2voto

mob Punkte 113680

Das ist keine gute Idee (man sollte entscheiden, ob ein Unterprogramm eine Methode ist oder nicht, und es auf konsistente Weise verwenden), aber in Momenten der Schwäche habe ich Konstruktionen wie diese verwendet:

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) = @_;
    ...
}

Normalerweise kann ich nur ein paar Stunden auf diesen Code starren, bevor sich die Scham in meinem Bauch sammelt und ich ihn reparieren muss.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X