示例代码:
package testClass1;
{
my $testClass2Ref;
sub new
{
my($class) = shift;
$testClass2Ref= shift;
bless $self, $class;
return $self;}
}
sub testRef
{
$testClass2Ref->testRef;
}
}
package testClass2;
{
sub new
{
my($class) = shift;
bless $self, $class;
return $self;}
}
sub testRef
{
print "Test 2";
}
}
use testClass1;
use testClass2;
my $testClass2 = testClass2->new();
my $testClass1 = testClass2->new($testClass2);
$testClass1->testRef;
当我尝试拨打$testClass1->testRef
时,$testClass2Ref=undef
。
如何从父级传递对象的引用?
哦,对不起,我在示例的构造函数中错过了字符串。
sub new
{
my($class) = shift;
$testClass2Ref = shift;
my $self = {name=>'testClass1'};
bless $self, $class;
return $self;
}
此测试正常,但Eclipse调试器将此变量显示为“undef”。
感谢您的帮助。
答案 0 :(得分:2)
除了语法错误,您还没有使用strict
模式。打开它会显示$self
未在任何一个包中声明。通过替换:
bless $self, $class;
使用:
my $self = bless {}, $class;
一切都按预期进行。
答案 1 :(得分:1)
修复语法错误时,它可以正常工作。
> ./test.pl
> Test 2
你错过了
my $self = {};
两个new
方法中的。
一个有用的工具是
perl -wc testClass1.pm
答案 2 :(得分:1)
可以在模块之间传递Perl对象引用吗?
绝对!
在这个测试脚本中,我创建了两个类,一个用于测试,另一个用于测试。记住对象只是引用,方法只是子例程;以同样的方式使用它们。
#!/usr/bin/env perl
use strict;
use warnings;
package Tester;
sub new {
my $class = shift;
my ($other) = @_;
my $self = { other => $other };
bless $self, $class;
return $self;
}
sub examine {
my $self = shift;
print "I'm holding a: ", ref( $self->{other} ), "\n";
}
package Candidate;
sub new { return bless {}, shift }
package main;
my $candidate = Candidate->new();
my $tester = Tester->new( $candidate );
$tester->examine();
编辑:现在使用更为现代化的系统MooseX::Declare
(基于Moose
)与Method::Signatures
。这样可以节省大量的样板,让您专注于您希望对象执行的操作,而不是如何实现它们。
#!/usr/bin/env perl
#technically Moose adds strict and warnings, but ...
use strict;
use warnings;
use MooseX::Declare;
use Method::Signatures::Modifiers;
class Tester {
has 'other' => ( isa => 'Object', is => 'rw', required => 1 );
method examine () {
print "I'm holding a: ", ref( $self->other() ), "\n";
}
}
class Candidate { }
no MooseX::Declare;
package main;
my $candidate = Candidate->new();
my $tester = Tester->new( other => $candidate );
$tester->examine();
对于更实际的情况,请参阅一些较大的模块系统如何传递表示复杂概念的对象。在我的头顶,HTTP::Response
对象遍布LWP
系统