2011-10-11 98 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