首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scalar::Util与ref函数

Scalar::Util与ref函数
EN

Stack Overflow用户
提问于 2010-12-10 04:54:28
回答 1查看 1.3K关注 0票数 8

内置ref($object)Scalar::Util blessed($object)有什么不同?一个比另一个更受欢迎吗?

代码语言:javascript
复制
use strict;
use warnings;

use Scalar::Util qw(blessed isvstring);

my $object = foo->new();

print "Object is a " . blessed($object) . "\n";
print "Object is a " . ref($object) . "\n";

my $version = 5.00.03;

print "Version is a " . ref(\$version) . "\n";
if (isvstring($version)) {
    print "Version is a VSTRING\n";
}

package foo;
sub new {
    my $class = shift;
    my $self = {};

    bless($self, $class);
    return $self;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-10 05:00:07

根据POD的说法,blessed()只适用于有福的引用(例如,传递给bless()调用的引用)。

它对其他所有内容返回undef,包括散列/数组引用,其中ref()返回HASH/ARRAY (以及perldoc ref中描述的一堆其他类型)。要获取引用类型,当然可以调用Scalar::Util::reftype

至于是否应该使用一个而不是另一个,我认为这很大程度上取决于逻辑是什么。

  • 如果你只想把真正的有福引用和其他所有东西区分开来,blessed()提供了一种更简洁的方法,而不是先获取一个ref,然后再验证值是否不在非有福引用返回的标准值上。

my $ref_type = ref($my_ref);print "USING REF:";if ( $ref_type && $ref_type ne ref({}) && $ref_type ne ref([]) && $ref_type ne“标量”#也可以使用包含ref()的所有允许值的散列,而不是& $ref_type !~ /^(CODE|REF|GLOB|...)$) { print“我是类$ref_type\n的对象”;} else {打印"I'm a reference of type $ref_type\n";}# vs...打印"USING SCALAR_UTIL:";my $ref_type = blessed($my_ref);打印$ref_type?“我是$ref_type\n类的对象”:“我是类型的引用”。reftype类型($my_ref)。“\n”;

  • 如果你需要在有福的引用和不同的有福的引用之间有细微的区别,那么一个单独的ref()调用比blessedref() hardcoded values的组合更简洁,在这两种方法之间有一个实际的功能差异,正如Eric Strom的评论中所指出的,当有人创建一个匹配ref()hardcoded values之一的类(例如bless [], 'HASH' -在这种情况下,他们要么是哑巴,要么是太聪明了一半)。

my = $sssft [],' HASH ';# sssft = someone_should_suffer_for_this ref_description_using_ref($sssft);ref_description_using_scalar_util($sssft);#输出: USING REF: I是使用SCALAR_UTIL的类型HASH的引用:I是HASH类的对象

免责声明:根据文档,当参数是一个类的引用时,两者应该没有区别(例如,它返回类名)。但是我还没有检查"Scalar::Util“来源来确认。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4403013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档