在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中不同的概念或类结构方法),我真的很想知道它。
提前感谢您的任何评论! : - )
答案 0 :(得分:8)
嗯,一种方法是使用inside-out objects。另一种方法是使用基于XS的类,其中标量存储存储属性的C / C ++结构的地址(这通常仅在类的目的是与C / C ++库接口时才执行)。 / p>
你也可以使用substr
或pack
做一些奇怪的事情,比如标量的索引部分,但我怀疑是否有人这样做,只是为了证明它可以完成。