gpt4 book ai didi

perl - 如何在 perl 中发现对象类型?

转载 作者:行者123 更新时间:2023-12-05 00:56:41 26 4
gpt4 key购买 nike

场景:

  • 有几个对象,从 My::ModulePath::Class 等创建...
  • 每个对象都可以调用特定方法
  • 返回一些字符串值
  • 需要构建一个 HashRef,其中 values 是字符串,

所以类似(非常短):

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";
}

在实际代码中,filenamemyobj 是用 Moose 定义的,例如:

has 'myobj' => (isa => 'My::Module', builder => ... ...);

但恕我直言,在这种情况下做一些类似 Moose 的 deep-coercion 比制作一个简单的 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";
}

关于perl - 如何在 perl 中发现对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20423369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com