如何处理基于SCALAR的Perl类的属性?

时间:2013-08-21 19:42:59

标签: perl class scalar

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

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 = $x$obj->property($x)之类的内容,并且可以独立于同一类的其他实例。那些属性存储在哪里?

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

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

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

1 个答案:

答案 0 :(得分:8)

嗯,一种方法是使用inside-out objects。另一种方法是使用基于XS的类,其中标量存储存储属性的C / C ++结构的地址(这通常仅在类的目的是与C / C ++库接口时才执行)。 / p>

你也可以使用substrpack做一些奇怪的事情,比如标量的索引部分,但我怀疑是否有人这样做,只是为了证明它可以完成。