Suchen Sie nach Perl, um zu überprüfen, ob $ self eine Klasse oder ein Objekt ist.

In Perl wurde ich gerade von etwas gebissen, das wie der folgende Fehler aussah:

package Foo;
sub method {
    my $self = shift;
    my @args = @_;
    ...
}

wo ich es als Subroutine aufgerufen habe, nicht als Methode:

Foo::method( "arg1", "arg2" );

Anstatt es als Methode aufzurufen - in diesem Fall war es eine "Klassenmethode":

Foo->method( "arg1", "arg2" );

Calling Foo :: method ("arg1", "arg2") hat dazu geführt, dass "arg1" gelöscht wurde.

Ähnliche Überlegungen können bei einer "Objektmethode" auftreten:

my $object = Foo->new();
$obj->method( "arg1", "arg2" );

Gibt es eine freundliche, prägnante Perl-Sprache, mit der überprüft werden kann, ob das erste Argument, das üblicherweise als @ bezeichnet wir$self, ist tatsächlich ein Objekt in der Klasse (Paket) und / oder der Klassen- / Paketname?

Das Beste, was ich mir ausgedacht habe, ist:

package Foo;
sub method {
    my $self = ($_[0]->isa(__PACKAGE__) ? shift @_ : die "...error message...";
    my @args = @_;
    ...
}

Das ist nicht viel prägnanter als

package Foo;
sub method {
    my $self = shift;
    die "...error message..."  if $self->isa(__PACKAGE__);
    my @args = @_;
    ...
}

ode

package Foo;
use Carp::Assert;
sub method {
    my $self = shift;
    assert($self->isa(__PACKAGE__));
    my @args = @_;
    ...
}

Anmerkungen

Ich kenne mich mit Perl-Signaturen aus, verwende aber keine experimentellen Funktionen.

Ich weiss Bescheiduse attributes und:method. Ist das der beste Weg? Ähnliche Bedenken hinsichtlich "sich entwickelnder" Funktionen.

Ich weiß über Moose Bescheid - aber ich glaube nicht, dass Moose dies erzwingt. (Habe ich etwas vergessen.

Das Problem mit Perl ist, dass es so viele Möglichkeiten gibt, etwas zu tun.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage