5

在 Perl 中,很容易 bless ahashref并使用它来存储和读取属性:

package MyPackage;
use strict;
use warnings;

sub new {
    bless {}, __PACKAGE__;
}

sub SomeProperty {
    my $self = shift;
    if (@_) {
        return $self->{SomeProperty} = shift;
    }
    $self->{SomeProperty};
}

# Or even like this to be able to call $obj->OtherProperty = $x;

sub OtherProperty : lvalue {
    my $self = shift;
    $self->{OtherProperty};
}

但是,我见过一些类(来自不同的 Perl 模块),当它们被转储时,会显示一个简单的标量祝福:

$obj = bless( \$8756489, 'Some::Package' );

然而,它们有方法和属性。我理解的方法,任何子程序包can调用然后将在询问祝福时被调用$object->name。我不明白的部分是他们如何存储属性。这些属性存储在哪里?

有几次他们接受类似$obj->property = $xor的东西,$obj->property($x)并且可以独立于同一类的其他实例。这些属性存储在哪里?

我知道这真的取决于类的底层实现,它在做什么或它正在与什么交互,并且实际上可以多次回答这个问题(例如,对象只是在某个地方与另一个对象或连接进行交互,并且只发送或查询它的值)。

但是,如果有一种方法可以让基于标量的对象存储属性(例如在 Perl 中以不同的概念或方法来处理类结构),我真的很想知道它。

提前感谢您的任何评论!:-)

4

1 回答 1

8

嗯,一种方法是使用由内向外的对象。另一种方法是使用基于 XS 的类,其中标量存储 C/C++ 结构的地址,其中存储了属性(这通常仅在该类的目的是与 C/C++ 库接口时才会这样做)。

substr您也可以使用or来做一些奇怪的事情,比如标量的索引部分pack,但我怀疑有人这样做过,除非证明它可以做到。

于 2013-08-21T19:53:54.403 回答