在Perl中,我被一些看起来像下面的bug的东西咬了一口:
package Foo;
sub method {
my $self = shift;
my @args = @_;
...
}
Run Code Online (Sandbox Code Playgroud)
我把它称为子程序,而不是方法:
Foo::method( "arg1", "arg2" );
Run Code Online (Sandbox Code Playgroud)
而不是将其称为方法 - 在这种情况下,它是一个"类方法":
Foo->method( "arg1", "arg2" );
Run Code Online (Sandbox Code Playgroud)
调用Foo :: method("arg1","arg2")导致"arg1"被删除.
使用"对象方法"可能会出现类似的注意事项:
my $object = Foo->new();
$obj->method( "arg1", "arg2" );
Run Code Online (Sandbox Code Playgroud)
是否有一个友好,简洁的Perl习惯用于检查传统上调用的第一个参数$self实际上是类(包)和/或类/包名称中的对象?
我想出的最好的是:
package Foo;
sub method {
my $self = ($_[0]->isa(__PACKAGE__) ? shift @_ : die "...error message...";
my @args = @_;
...
}
Run Code Online (Sandbox Code Playgroud)
这并不简单
package Foo;
sub method {
my $self = shift;
die "...error message..." if …Run Code Online (Sandbox Code Playgroud)