首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“`bless`”在一个括号结构中做什么?

“`bless`”在一个括号结构中做什么?
EN

Stack Overflow用户
提问于 2011-07-12 14:57:37
回答 3查看 280关注 0票数 5
代码语言:javascript
复制
my $self; { my %hash; $self = bless(\%hash, $pkg); }

引用自HTML/Template.pm,为什么不简单地使用bless $self,$pkg

EN

回答 3

Stack Overflow用户

发布于 2011-07-12 15:38:45

我认为这样做的目的是将%hash的范围限制在封闭的块中。这可以重写为:

代码语言:javascript
复制
my $self = bless {}, $pkg;
票数 4
EN

Stack Overflow用户

发布于 2011-07-12 16:01:37

代码语言:javascript
复制
 $hash  =   {};
 ^^^^^      ^^
referrer referent

在以下语句中:

代码语言:javascript
复制
$self = bless( $hash, $pkg );

bless$hash引用的对象(匿名散列)标记为$pkg ( HTML::Template类)的对象。它不会更改$hash变量。

bless函数返回对受祝福的匿名散列的引用。因此,$self变成了对受祝福的匿名散列( referent)的引用。

重要的是要记住,如果bless函数的第一个参数是一个引用,那么它所引用的就是有福的东西,而不是变量本身:

代码语言:javascript
复制
$self = bless( $self, $pkg );

$self不是指任何东西--它就是undef。没有什么可以祝福的东西。它等同于尝试这样做:

代码语言:javascript
复制
$self = bless( undef, $pkg );

Bless My Referents为这个主题提供了一个很好的介绍。

票数 2
EN

Stack Overflow用户

发布于 2011-07-12 15:01:08

因为$selfundef -几乎等同于:

代码语言:javascript
复制
my $self ={}; { $self = bless($self, $pkg); }

或者:

代码语言:javascript
复制
$self = bless( {}, $pkg);

编辑回复评论的

你不能使用undef,因为你会得到错误Can't bless non-reference value at ...。这是因为只有硬引用才可能是有福的。这就是Perl强制对象封装的方式。请参阅perlobj manpage

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

https://stackoverflow.com/questions/6660528

复制
相关文章

相似问题

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