如何处理基于标量的Perl类上的属性?
在Perl中,很容易使用如何处理基于标量的Perl类上的属性?,perl,class,scalar,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->{SomeProper
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' );
然而,它们有方法和属性。我理解的方法是,当询问一个受祝福的$object->name
时,包可以调用的任何子例程都将被调用。我不理解的部分是它们如何存储属性。这些财产存放在哪里
有几次,它们接受诸如$obj->property=$x
或$obj->property($x)
之类的内容,并且可以独立于同一类的其他实例。这些财产存放在哪里
我知道这实际上取决于类的底层实现、它正在做什么或它正在与什么交互,这实际上可以多次回答这个问题(例如,对象只是与另一个对象或某个连接交互,并且只向它发送或查询值)
但是,如果有一种方法可以让基于标量的对象存储属性(比如Perl中的类结构的不同概念或方法),我真的很想知道
提前感谢您的评论!:-) 嗯,一种方法是使用。另一种方法是使用基于XS的类,其中标量存储存储属性所在的C/C++结构的地址(通常仅当类的目的是与C/C++库接口时才执行此操作)
你也可以用substr
或pack
做一些奇怪的事情,比如索引标量的部分,但我怀疑除了证明这是可以做到的以外,是否有人做过这件事。你能举一个这样的模块的例子吗?我真的不知道,每次看到它,我都会越来越好奇,这实际上只是我尝试转储对象以查看某些值的时候。我现在想到的一个例子是GD。创建一个新的GD::Image
,然后将其转储。GD::Image将是一个基于XS的类的示例,因为它是到的Perl绑定。