Perl Classes,Blessing Hashes是什么?

Perl Classes, what is with Blessing Hashes?

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

当我创建一个类的新实例时,一个构造函数将如何返回对散列的幸运引用呢?我可以理解"return(this);"或者这些行中的一些内容,但是返回一些其他随机变量只会让我感到困惑(特别是当您应该使用哈希时)。

1
2
3
4
5
6
my ?var = new Test("foo");
package Test;
our $localvar;
sub new{
 localvar = $_[1];
}

好的,我有这门基础课。我可以在初始化类变量时设置它,然后像$var::localvar那样使用它。但要让它在Perl中实际编译和工作,我需要在"returnbess,shift;"一行中添加内容。你说什么?

似乎这个散列被用作该类的实例,方法是相当静态的。但是你仍然可以有类变量。听起来您只是在将数据对象链接到将该对象作为参数的方法列表。但我不知道为什么每一个教程都意味着,如果这是所有的事情,你总是使用哈希。我很困惑为什么你有这个哈希表和你在课堂上声明的任何"我们的",它们看起来像互相排斥的概念?


It sounds like you are just linking a data object to a list of methods that take that object as a argument.

这就是OO,是的。从构造函数返回的是实例。与其他一些语言不同的是,该语言在后台创建了一个新的"对象实例",而您的构造函数只是负责填充槽,在Perl中,您的构造函数方法可以完成整个工作。{}创建了对一个新的匿名散列的引用,该散列将成为对象的存储,而bless通过用类名标记它,实际上将该引用转换为对象。

But I am not sure why every tutorial would imply that you always use a hash if that was all that was happening.

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

I can set a class variable when I initialize it and then later use it like ?var::localvar.

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


How does it make any sense that a constructor would return a blessed reference to a hash when I create a new instance of a class?

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

I could understand"return (this);" or something along those lines

那么,困惑是什么呢?这正是你应该回去的地方。(除本公约称之为$self外。)

1
2
3
4
5
6
7
sub new {
    my ($class, ...) = @_;
    my $self = bless({}, $class);  # Or: my $self = $class->SUPER::new(...);
    $self->{attribute1} = ...;
    $self->{attribute2} = ...;
    return $self;
}

It seems that this hash is sort of used as the instance of that class,

幸运散列是该类的实例,也就是对象。

评论中的问题

Why do I have to [do my $self = bless({}, $class);] instead of just referencing the class instance. Like: $self = bless($class)

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

通过将这两个变量分开,您可以选择为对象使用不同的基变量。例如,io::socket::inet使用一个glob而不是散列。

But most objects anyone would make would have no use for a hash in my opinion. A hash is a pretty specific data structure that is not needed or helpful for 99% of coding.

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

在远超过1%的编码中,关联数组(散列表或其他)都是"必需的和有用的"。