2011-10-11 127 views
1

我很新的perl。我有一個SomeItem對象,它包含一個InnerObject對象,我想在其上調用「foo」方法。訪問對象內的對象? (Perl)

foreach $obj (@ { $self->{InnerObjects} }) { 
    $obj->foo(); 
} 

這是行不通的。這裏的錯誤,我得到:

無法調用「foo」而不會有一個包或對象引用

的InnerObject類是在同一文件中SomeItem,並希望如果可以保持這樣的說法,那麼我怎樣才能從SomeItem類/包中訪問InnerObject類/包?

以下是我聲明數組構造函數:

$self->{InnerObjects} = []; 

,並設置:

sub set { 
    my ($self, @items) = @_; 
    @{ $self->{InnerObjects} } = @items; 
} 
+2

你如何建立'InnerObjects'? –

+5

'$ self - > {InnerObjects}'不包含(對一個對象數組的引用)。它是對數組的引用,但該數組包含除(僅)對象之外的其他內容。錯誤不在您發佈的代碼中。 – ikegami

+0

如果它們是'InnerObjects',那麼你的for循環將起作用。爲什麼不嘗試傾銷'$ self - > {InnerObjects}'的內容並查看實際內容。 – stevenl

回答

0

我對該問題的解決方案最終創建了一個包含SomeItem的ID的散列,該ID指向一個InnerObjects數組的引用。該散列被操縱classlike這樣創建的,

%SomeItemInnerObjects;  # Hash of SomeItem IDs=>InnerObject array references 
$SomeItemInnerObjects{ $currentSomeItem->{ID} } = \@myInnerObjects; 

,並得到使用方法如下:

foreach $item (@{ $SomeItemInnerObjects{$currentSomeItem->{ID} } }) { 
    # item is an InnerObject 
    $item->foo($currentSomeItem->{ID}); 
} 

所以SomeItem不再包含InnerObjects。我知道這本身並沒有回答這個問題,但提出了一個替代解決方案。

0

您的代碼至今看起來合法的。因此,錯誤可能在傳遞給set()的數據中。

請添加下面的設置代碼:

sub set { 
    my ($self, @items) = @_; 
    @{ $self->{InnerObjects} } = @items; 
    print "OBJECT To work on: " . ref($self) . "\n"; 
    print "TOTAL objects passed: " . scalar(@items) . "\n"; 
    foreach my $obj (@items) { print "REF: " . ref($obj) . "\n" }; 
} 

這將顯示你有多少個對象過去了,他們是否確實是正確的類的對象(ref應打印類名)

另外,請請注意,@{ $self->{InnerObjects} } = @items;拷貝通過對象引用的數組,而不是存儲對原始數組的引用@items - 這不是你的問題的原因,但導致你基本上分配2個數組而不是即除非數組非常大,但仍然是浪費(@items數組需要在完成set()後被垃圾收集),這不是主要的問題。

我很抱歉把本質上的評論內容作爲答案,但它太大而不能成爲評論。

+0

當我調用'$ currentSomeItem-> set(@myInnerObjects)'時,它似乎失去了它的身份'一旦我嘗試在這些InnerObject上的currentSomeItem中做任何事情,它就會因爲那個錯誤而失敗。有沒有像Java或其他強類型語言那樣將其轉換爲InnerObject的方法? – Mushr00mOmelet

+0

@ Mushr00mOmelet - 這些調試打印生成的是什麼? – DVK

+0

@ Mushr00mOmelet - 並請提供調用'代碼set' – DVK