2016-02-08 30 views
1

我有一個基於祝福hashref的Perl類(https://github.com/kylemhall/Koha/blob/master/Koha/Object.pm如何停止或允許將perl對象用作hashref?

這是一個基於社區的項目,擁有許多不同技能的開發人員。

我看到的是一些開發者意外地將我們的對象用作hashrefs。實際數據不存儲在有福的hashref中,而是存儲在hashref中存儲的dbic對象中(在$ self - > {_ result}中)。當開發人員嘗試像$ object - > {id} perl這樣的東西不會抱怨時,它會像預期的那樣返回undef。

我想要做的是要麼 A)製作的腳本錯誤爆炸發生這種情況時 B)允許設置/存儲在$自我DBIC對象獲取值使用hashref語法 - > {_}結果

我試着使用:

use overload '%{}' => \&get_hashref; 

,但是當我這樣做,get_hashref被稱爲隨時常規方法被調用!這是有道理的,因爲對象本身是一個hashref。我確信這與Perl內部的有福的hashrefs作爲對象有關。

我試圖完成甚至可能嗎?

回答

5

我建議使用基於標量或基於數組的對象而不是基於散列的對象。這是一種便宜(高效)的解決方案,因爲它只是使違法者違反現有的類型檢查。

例如,下面產生的對象只是對實際對象的引用。只需在方法中使用$$self而不是$self。要做到這一點

$ perl -e' 
    sub new { 
     my $class = shift; 
     my $self = bless(\{}, $class); 
     # $$self->{...} = ...; 
     return $self; 
    } 
    my $o = __PACKAGE__->new(); 
    my $id = $o->{id}; 
' 
Not a HASH reference at -e line 9. 
+0

謝謝!有了這個想法,我不僅能夠保護對象免受不當使用,而且能夠完成我希望做的hashref仿真! – Kyle

+0

鏈接到那些有興趣的補丁:https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=15759 – Kyle

+0

@ikegami - 很好!當你建議使用「基於標量或基於數組的對象」時,我認爲需要進行重大改寫。 –

3

的一種方式是通過使用「由內向外的對象」,這裏的對象僅僅是一個福地簡單的標量,並且數據被分開存儲。 例如,參見Class::STD

+0

:-D耶!一些舊金山,但提高點。我預計有一天Inside Out會再次變涼。你嘗試過['Dios'](https://metacpan.org/pod/Class::Std)嗎? –