当前位置:  开发笔记 > 编程语言 > 正文

Perl的"祝福"到底是做什么的?

如何解决《Perl的"祝福"到底是做什么的?》经验,为你挑选了4个好方法。

我理解在类的"新"方法中使用Perl中的"bless"关键字:

sub new {
    my $self = bless { };
    return $self;
}    

但究竟什么是"祝福"对哈希引用呢?



1> Gordon Wilso..:

通常,bless将对象与类关联.

package MyClass;
my $object = { };
bless $object, "MyClass";

现在当你调用一个方法时$object,Perl知道要搜索该方法的包.

如果省略第二个参数,如示例中所示,则使用当前包/类.

为清楚起见,您的示例可能写成如下:

sub new { 
  my $class = shift; 
  my $self = { }; 
  bless $self, $class; 
} 

编辑:请参阅kixx的更好细节的答案.



2> kixx..:

bless 将引用与包关联.

引用的内容并不重要,它可以是散列(最常见的情况),数组(不常见),标量(通常这表示内向外对象),正则表达式,子程序或TYPEGLOB(参见" 面向对象的Perl:Damian Conway的概念和编程技术综合指南 "一书中的有用示例)或者甚至是对文件或目录句柄的引用(最不常见的情况).

效果bless是它允许您将特殊语法应用于祝福的引用.

例如,如果存储了一个有福的引用$obj(bless与包"Class" 关联),那么$obj->foo(@args)将调用一个子例程foo并作为第一个参数传递引用,$obj后跟其余的arguments(@args).子程序应在包"Class"中定义.如果foo包"Class"中没有子程序,@ISA则将搜索其他包的列表(从包"Class"中的数组中获取),并且将调用foo找到的第一个子例程.


@Blessed Geek,这不是理论上的细节.差异具有实际应用.
您的初始陈述不正确.是的,bless将引用作为其第一个参数,但它是受祝福的引用变量,而不是引用本身.$ perl -le'sub Somepackage :: foo {42}; %H =(); $ H = \%H; 祝福$ h,"Somepackage"; $ j = \%h; print $ j-> UNIVERSAL :: can("foo") - >()'42
现在,"per-out-object"的旧perlfoundation.org链接充其量只能在登录墙后面.[Archive.org链接原文在这里](https://web.archive.org/web/20071024192241/http://www.perlfoundation.org/perl5/index.cgi?inside_out_object).

3> chaos..:

简短版本:它标记了附加到当前包命名空间的散列(以便该包提供其类实现).



4> 小智..:

此函数告诉REF引用的实体它现在是CLASSNAME包中的对象,或者如果省略CLASSNAME则是当前包.建议使用两种形式的祝福.

示例:

bless REF, CLASSNAME
bless REF

回报价值

此函数返回对包含在CLASSNAME中的对象的引用.

示例:

以下是显示其基本用法的示例代码,通过祝福对包的类的引用来创建对象引用 -

#!/usr/bin/perl

package Person;
sub new
{
    my $class = shift;
    my $self = {
        _firstName => shift,
        _lastName  => shift,
        _ssn       => shift,
    };
    # Print all the values just for clarification.
    print "First Name is $self->{_firstName}\n";
    print "Last Name is $self->{_lastName}\n";
    print "SSN is $self->{_ssn}\n";
    bless $self, $class;
    return $self;
}

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有