我见过像这样的代码
package xyz;
# putting the module inside its own pair of braces
{
public _foo => my %_foo;
public _bar => my %_bar;
# some subroutines..
}
1;
我的问题是宣言的含义到底是什么_foo =>我的%_foo; 我的意思是如何使用public关键字,为什么我们使用大箭头来分配另一个哈希?
非常感谢任何帮助。
答案 0 :(得分:3)
哦,你在使用Class::InsideOut吗?
在这种情况下,它不是关键字,它实际上是一个子程序。它在包中设置一个存储变量,用作类属性。
基本上,Inside-Out对象是一种在Perl中获得真正封装的方法。通常,Perl对象将其值存储在哈希引用中,然后将其返回给用户,如下所示:
package Foo;
use strict;
use warnings;
sub new {
my ($class, %args) = @_;
return bless {
foo => $args{foo},
bar => $args{bar},
}, $class;
}
sub get_foo {
my $self = shift;
return $self->{foo};
}
sub get_bar {
my $self = shift;
return $self->{bar};
}
1;
正如您所看到的,实际上该类所包含的内容的详细信息将返回给用户!他们可以在不使用存取器的情况下随意丢弃。 Whups。
内部对象使用的事实是包内的词法变量(例如my
变量)不能在其范围之外看到。它使用的事实是每个唯一标量引用都有一个唯一的地址,为哈希提供了一个唯一的键,允许我们为类数据提供一个唯一的,受限制的存储。基本模式如下所示:
package Foo;
use strict;
use warnings;
use Scalar::Util qw/refaddr/;
{
my %_foo_of;
my %_bar_of;
sub new {
my ($class, %args) = @_;
# create a reference to an anonymous scalar.
my $instance = \do { my $anon_scalar };
$_foo_of{ refaddr $instance } = $args{foo};
$_bar_of{ refaddr $instance } = $args{bar};
return $instance;
}
# we have to manually delete these since they don't go out of scope
# automatically like standard Perl classes do!
sub DESTROY {
my $self = shift;
delete $_foo_of{ refaddr $self };
delete $_bar_of{ refaddr $self };
}
sub get_foo {
my $self = shift;
return $_foo_of{ refaddr $self };
}
sub get_bar {
my $self = shift;
return $_bar_of{ refaddr $self };
}
}
1;
Ewwww。很多样板。更多的模板工作。烦。
现在让我们看一下Class::InsideOut
。
package Foo;
use strict;
use warnings;
use Class::InsideOut qw/new public/;
public foo => my %foo;
public bar => my %bar;
1;
DONE!
如果需要,您可以创建一个更复杂的new
子例程,但这会自动设置一个默认的new
子例程,用于从命名参数初始化foo
和bar
。 / p>
Class :: InsideOut使得你不必做那个样板文件。它使你的访问者,它为你创建匿名标量,它使你的析构函数,并给你一个很好的id
关键字而不是refaddr。除此之外,一切都是一样的。它只是摆脱了你通常需要处理的一些样板文件,使内部课程变得简单(和有趣!)使用。