对于不再在Perl中使用的对象,我该怎么办?
发布时间:2020-12-15 23:24:46 所属栏目:大数据 来源:网络整理
导读:我正在编写一个链接到外部资源的类.其中一种方法是破坏外部资源的删除方法.不应该对该对象进行进一步的方法调用.如果设置了标志,我想在所有方法中设置一个标志和死亡,但是有更好,更简单的方法吗?可能涉及DESTROY的东西? 到目前为止,我真的很喜欢Axeman的建
我正在编写一个链接到外部资源的类.其中一种方法是破坏外部资源的删除方法.不应该对该对象进行进一步的方法调用.如果设置了标志,我想在所有方法中设置一个标志和死亡,但是有更好,更简单的方法吗?可能涉及DESTROY的东西?
到目前为止,我真的很喜欢Axeman的建议,但使用AUTOLOAD是因为我懒得重新创建所有方法: #!/usr/bin/perl use strict; use warnings; my $er = ExternalResource->new; $er->meth1; $er->meth2; $er->delete; $er->meth1; $er->meth2; $er->undelete; $er->meth1; $er->meth2; $er->delete; $er->meth1; $er->meth2; $er->meth3; package ExternalResource; use strict; use warnings; sub new { my $class = shift; return bless {},$class; } sub meth1 { my $self = shift; print "in meth1n"; } sub meth2 { my $self = shift; print "in meth2n"; } sub delete { my $self = shift; $self->{orig_class} = ref $self; return bless $self,"ExternalResource::Dead"; } package ExternalResource::Dead; use strict; use Carp; our $AUTOLOAD; BEGIN { our %methods = map { $_ => 1 } qw/meth1 meth2 delete new/; } our %methods; sub undelete { my $self = shift; #do whatever needs to be done to undelete resource return bless $self,$self->{orig_class}; } sub AUTOLOAD { my $meth = (split /::/,$AUTOLOAD)[-1]; croak "$meth is not a method for this object" unless $methods{$meth}; carp "can't call $meth on object because it has been deleted"; return 0; } 解决方法
简单地将对象视为无效状态是否存在问题.如果用户坚持下去,那不就是他们的问题吗?
以下是一些注意事项: >你已经决定是否值得死了吗? 以下是一些建议: >您可以将对象重新编入一个类,其唯一的工作是指示无效状态.它具有相同的基本形式,但表中的所有符号都指向一个只是说“抱歉不能这样做,我已经关闭(你关闭我,记得吗?)”的子. 一些概念证据: use feature 'say'; package A; sub speak { say 'Meow!'; } sub done { undef $_[0]; } package B; sub new { return bless {},shift; } sub speak { say 'Ruff!' } sub done { bless shift,'A'; } package main; my $a = B->new(); my $b = $a; $a->speak(); # Ruff! $b->speak(); # Ruff! $a->done(); $a->speak(); # Meow! $b->speak(); # Meow! <- $b made the switch $a->done(); $b->speak(); # Meow! $a->speak(); # Can't call method "speak" on an undefined value at - line 28 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |