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

Fra*_*ozo 5 perl scalar class

在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};
}
Run Code Online (Sandbox Code Playgroud)

但是,我已经看到一些类(来自不同的Perl模块),当转储时,显示一个简单的标量祝福:

$obj = bless( \$8756489, 'Some::Package' );
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

提前感谢您的任何意见!:-)

cjm*_*cjm 8

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

你也可以做一些奇怪的事情,比如标量的索引部分使用substr或者pack,但我怀疑是否有人这样做,除了证明它可以完成.