我试图了解如何在Perl OO中使用实例变量 - 更具体地说,与外部资源结合使用.让我解释:
我们有一个DLL,它暴露了我想通过Perl API公开的一些功能.我使用Win32 :: OLE来访问此DLL.所以我的构造函数很简单:
package MY_CLASS;
use Win32::OLE;
sub new
{
my ($class) = @_;
# instantiate the dll control
my $my_dll = Win32::OLE->new("MY_DLL.Control");
my $self = {
MY_DLL => \$my_dll,
};
bless $self, $class or die "Can't bless $!";
return $self;
}
sub DESTROY
{
my ($self) = shift;
undef $sef->{MY_DLL};
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在为实例变量MY_DLL分配引用$my_dll.我有几个问题:
1)如何调用实例变量,因为它指向引用.那么,换句话说,如何在实例化的dll上调用方法,如下所示:
my $dll_class = new MY_CLASS;
$dll_class->{MY_DLL}->launch();
Run Code Online (Sandbox Code Playgroud)
假设launch()是由dll公开的方法.但是由于{MY_DLL}指向一个引用,Perl抱怨这是可以理解的.语法是什么?
2)我是否需要特别undef在DESTROY?即使我不具体,undef它也会自动清理Perl 吗?
1)在调用之前取消引用引用:
${$dll_class->{MY_DLL}}->launch();
Run Code Online (Sandbox Code Playgroud)
通过使用\$,您将采用标量参考.${...}是标量去参考操作.
我不确定为什么你需要使用对引用的引用 - 你可以简单地设置MY_DLL $my_dll,因为它已经是一个引用:
# ...
my $self = {
MY_DLL => $my_dll, # note, the \ is no longer in front of $my_dll
};
# ...
Run Code Online (Sandbox Code Playgroud)
然后你可以用原始语法调用它:
$dll_class->{MY_DLL}->launch();
Run Code Online (Sandbox Code Playgroud)
2)Perl会自动清理没有引用指向它的任何东西.当你的对象被销毁时,\$my_dll将不再有对它的引用,因此也不会引用它,因此$my_dll它将被自动销毁.
通常,只需要担心是否有指向自身的递归数据结构.在这些情况下,您可以DESTROY手动断开链接; 在您的情况下,您不需要将句柄显式设置为undef.
有关参考的更多信息,请参阅perlref.有关垃圾收集,DESTROY方法和循环引用的信息,请参阅perlobj的"Destructors"部分.
| 归档时间: |
|
| 查看次数: |
1280 次 |
| 最近记录: |