在Perl中在变量定义之前设置类/模块名称有什么作用?

mfa*_*kus 6 perl

在使用Net::SIP我在某些函数中注意到的模块时,有一些代码定义了一个参数的类.例如:

sub can_deliver_to {
    my Net::SIP::Leg $self = shift;
    [...]
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

指定Net::SIP::Leg对定义的目的是什么$self?是否只是语法糖来帮助开发人员知道$self应该是什么类型的变量?

Pat*_*zek 4

如果以某种无效方式访问结构/对象,它会引发编译时错误。

请参阅https://perldoc.perl.org/functions/my.html

my VARLIST
my TYPE VARLIST
my VARLIST : ATTRS
my TYPE VARLIST : ATTRS
Run Code Online (Sandbox Code Playgroud)

Amy将列出的变量声明为封闭块、文件或 eval 的本地(词法)变量。如果列出多个变量,则该列表必须放在括号中。

TYPE 和 ATTRS 的确切语义和接口仍在不断发展。TYPE 可以是一个裸字,一个用use constant, 或声明的常量__PACKAGE__。它当前绑定到 pragma 的使用fields,并且使用attributespragma 处理属性,或者从 Perl 5.8.0 开始也通过Attribute::Handlers模块处理。

如果您跳转到https://perldoc.perl.org/fields.htmlfields上的文档,您会得到以下示例:

{
    package Foo;
    use fields qw(foo bar _Foo_private);
    sub new {
        my Foo $self = shift;
        unless (ref $self) {
            $self = fields::new($self);
            $self->{_Foo_private} = "this is Foo's secret";
        }
        $self->{foo} = 10;
        $self->{bar} = 20;
        return $self;
    }
}
my $var = Foo->new;
$var->{foo} = 42;

# this will generate a run-time error
$var->{zap} = 42;

# this will generate a compile-time error
my Foo $foo = Foo->new;
$foo->{zap} = 24;
Run Code Online (Sandbox Code Playgroud)