Perl类,什么是祝福哈希?

Perl类,什么是祝福哈希?,perl,Perl,我不明白为什么Perl构造函数需要所有这些祝福,为什么它总是用散列来完成(显然,可以使用其他变量类型) 当我创建一个类的新实例时,构造函数将返回一个对散列的引用,这有什么意义呢?我可以理解“return(this);”或类似的内容,但返回一些其他随机变量只是让我感到困惑(特别是当您应该使用散列时) 好的,我有这个基础课。我可以在初始化类变量时设置它,然后像$var::localvar那样使用它。但要让它在Perl中真正编译和工作,我需要在“return bless{},shift;”行中添加它

我不明白为什么Perl构造函数需要所有这些祝福,为什么它总是用散列来完成(显然,可以使用其他变量类型)

当我创建一个类的新实例时,构造函数将返回一个对散列的引用,这有什么意义呢?我可以理解“return(this);”或类似的内容,但返回一些其他随机变量只是让我感到困惑(特别是当您应该使用散列时)

好的,我有这个基础课。我可以在初始化类变量时设置它,然后像$var::localvar那样使用它。但要让它在Perl中真正编译和工作,我需要在“return bless{},shift;”行中添加它

看起来这个散列有点像那个类的实例,方法是相当静态的。但仍然可以使用类变量。听起来您只是将一个数据对象链接到一个以该对象为参数的方法列表。但我不确定为什么每个教程都会暗示,如果这就是所有发生的事情,那么您总是使用散列。我很困惑,为什么这个散列和你在类中声明的任何“我们的”都有,它们看起来像是相互排斥的概念

听起来您只是将一个数据对象链接到一个以该对象为参数的方法列表

这正是OO的含义,是的。从构造函数返回的是实例。与其他一些语言不同,在这些语言中,该语言在后台创建一个新的“对象实例”,并且构造函数只负责填充插槽,在Perl中,构造函数方法可以完成整个工作
{}
创建对新匿名哈希的引用,该哈希将成为对象的存储,
bless
通过使用类名标记该引用,将其实际转化为对象

但我不确定为什么每个教程都会暗示,如果这就是所有发生的事情,那么您总是使用散列

类可以是任何类型的引用,但哈希引用是最有用和最方便的,因为哈希具有命名槽,因此可以按名称引用对象的属性。还有一些例子有globref对象(filehandles和sockets)、arrayref对象(很少见,当作者非常关心速度和内存使用时,通常用于只有几个字段的对象)和scalarref对象(通常用于封装某些C库返回的指针)。但是hashref对象是“标准的”

我可以在初始化类变量时设置它,然后像?var::localvar那样使用它

但你为什么要这么做?类变量几乎是完全无用的,在你掌握了更基本、更有用的东西之前,没有理由去麻烦它们

当我创建一个类的新实例时,构造函数将返回一个对散列的引用,这有什么意义呢

好吧,如果你不返回你创建的对象,它将是一个相当无用的构造函数

我能理解“还(这个);”或类似的话

那混乱是什么呢?这正是你应该返回的。(除非约定将其命名为
$self

这个散列似乎被用作该类的实例

hash是该类的实例,也就是对象


评论中的问题 为什么我必须[do
my$self=bless({},$class);
]而不是仅仅引用类实例。比如:
$self=bless($class)

{}
分配一个变量,并将其与类关联起来。创建对象的两个必要步骤

通过将两者分开,您可以选择为对象使用不同的基变量。例如,IO::Socket::INET使用glob而不是哈希


但在我看来,任何人制作的大多数对象都没有哈希的用处。哈希是一种非常特殊的数据结构,99%的编码都不需要它,也没有帮助

重点不是使用哈希表;最好使用关联数组(其中每个元素都是一个属性)


关联数组(哈希表或其他)在远远超过1%的编码中都是“需要的和有用的”。

Hobbs下面的回答非常好,但我也建议在Perl 5中使用栓接对象系统。虽然使用Moose很好,但首先了解底层对象系统的工作原理很重要,这样你就知道驼鹿解决了什么问题。否则,这就像是在不学习代数的情况下尝试做微积分。这也值得在
perlootut
manpage中查看,这比管道上的许多Perl OO内容都要新。1<代码>$Test::localvar不是类变量,而是包变量,一种全局变量。2.您不能使用
$var
按名称获取
$Test::localvar
。3.你的大多数问题都是通过面向对象编程的介绍来回答的;买本书可能会更好地为你服务。4.介绍性OOP文本未涵盖的问题由介绍性Perl文本涵盖;我建议你也买一个。但是为什么类变量没用呢?如果我理解正确的话。我可以使用标量而不是散列,创建一个有点普通的OOJava/C++风格的类?除了我可以在实例中存储一个额外的标量之外?为什么我不能这样做呢?@JonathonWisnoski类变量是每个类的。如果您使用scalarref对象,您将在哪里存储实例成员?哦,这解释了很多。这使得这一信息更有意义。因此,包中声明的所有内容都是静态的,返回的变量是整个实例。但在我看来,任何人创建的大多数对象都不会使用哈希。杂烩是一种美味
my ?var = new Test("foo");
package Test;
our $localvar;
sub new{
 localvar = $_[1];
}
sub new {
    my ($class, ...) = @_;
    my $self = bless({}, $class);  # Or: my $self = $class->SUPER::new(...);
    $self->{attribute1} = ...;
    $self->{attribute2} = ...;
    return $self;
}