在使用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应该是什么类型的变量?
如果以某种无效方式访问结构/对象,它会引发编译时错误。
请参阅https://perldoc.perl.org/functions/my.html
Run Code Online (Sandbox Code Playgroud)my VARLIST my TYPE VARLIST my VARLIST : ATTRS my TYPE VARLIST : ATTRSA
my将列出的变量声明为封闭块、文件或 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)