如何在perl中发现对象类型?
发布时间:2020-12-16 06:06:09 所属栏目:大数据 来源:网络整理
导读:场景: 有几个对象,从My :: Module和Path :: Class创建,像… 每个对象都可以返回一些调用特定方法的字符串值 需要构建一个HashRef,其值为字符串, 所以像(非常简短): package Some;sub filename { file('/tmp/xxx') } #Path::Class the filename-stringify'
场景:
>有几个对象,从My :: Module和Path :: Class创建,像… 所以像(非常简短): package Some; sub filename { file('/tmp/xxx') } #Path::Class the filename->stringify' returns the string value sub myobj { My::Module->new(....) } #the myobj->stringvalue returns the string value sub text { 'some text' } sub data { my $strhr; $strhr->{$_} = $self->make_string $self->$_ for(qw(filename myobj text)); return $strhr; } sub make_string { my($self,$val) = @_; return $val->stringify if( VAL_IS_PATH::CLASS_OBJ ); #need help here return $val->stringvalue if( VAL_IS_My::Obj_OBJ ); #and here return $val if( VAL_IS_SIMPLE_STRING ); #and here croak "unknown value"; } 在实际代码中,文件名和myobj是用Moose定义的,如: has 'myobj' => (isa => 'My::Module',builder => ... ...); 但是在这种情况下,恕我直言做一些Moose-ish深度强制要比制作一个简单的make_string过滤子更复杂.但是,我对任何推荐的解决方案都开放了…… 所以,问题是 – 如何发现什么对象是$val,或者它是一个简单的Str. 编辑: 基于@David W.的评论我得到了下一个: sub make_string { my($self,$val) = @_; my $vref = ref $val; #for the "text" returns the string itself return $val->stringify if( $vref =~ /^Path::Class/ ); #works return $val->stringvalue if( $vref =~ /^My::Module/ ); #works return $val if( VAL_IS_SIMPLE_STRING ); #returns the string itself,so how to check this??? croak "unknown value"; } 解决方法
使用isa方法.它在UNIVERSAL包中定义(参见perldoc UNIVERSAL).所有Perl类都隐式继承自UNIVERSAL.
use Scalar::Util qw( blessed ); if (blessed($val) and $val->isa('Path::Class')) { print "It's a Path::Class object!n"; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |