2013-08-21 26 views
5

在Perl中,可以很容易地保佑hashref,並用它來存儲和讀取性能:如何處理基於SCALAR的Perl類的屬性?

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

你能舉出任何這樣的模塊的例子嗎? – Borodin

+0

我真的沒有跟蹤,這只是讓我每次看到它都會越來越好奇,這實際上只是那些我真正嘗試轉儲對象以查看某些值的時間。我現在想到的一個例子是GD。創建一個'新的GD :: Image'然後轉儲它。 –

+0

GD :: Image是一個基於XS的類的例子,因爲它是一個Perl綁定到[libgd](http://www.libgd.org/)。 – cjm

回答

8

那麼,一種方法是使用inside-out objects。另一種方法是使用基於XS的類,其中標量存儲其中存儲屬性的C/C++結構的地址(通常僅當類的目的是與C/C++庫進行交互時才執行此操作)。

你也可以使用substrpack做一些奇怪的事情,比如標量的索引部分,但我懷疑除了證明它可以完成之外,任何人都可以做到。