如何在perl中使用公共关键字?

时间:2010-07-14 15:21:13

标签: perl

我见过像这样的代码

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关键字,为什么我们使用大箭头来分配另一个哈希?

非常感谢任何帮助。

1 个答案:

答案 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子例程,用于从命名参数初始化foobar。 / p>

Class :: InsideOut使得你不必做那个样板文件。它使你的访问者,它为你创建匿名标量,它使你的析构函数,并给你一个很好的id关键字而不是refaddr。除此之外,一切都是一样的。它只是摆脱了你通常需要处理的一些样板文件,使内部课程变得简单(和有趣!)使用。