3

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

当我创建一个类的新实例时,构造函数返回对哈希的祝福引用有什么意义?我能理解“return (this);” 或类似的东西,但返回一些其他随机变量只会让我感到困惑(特别是当你应该使用哈希时)。

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

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

似乎这个散列被用作该类的实例,方法相当静态。但是您仍然可以拥有类变量。听起来您只是将数据对象链接到以该对象为参数的方法列表。但我不确定为什么每个教程都暗示你总是使用哈希,如果这就是发生的一切。而且我很困惑为什么你有这个哈希和你在课堂上声明的任何“我们的”,它们似乎是相互排斥的概念?

4

2 回答 2

16

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

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

但我不确定为什么每个教程都暗示你总是使用哈希,如果这就是发生的一切。

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

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

但你为什么要?类变量几乎完全没用,除非你掌握了更基本、更有用的东西,否则没有理由去打扰它们。

于 2013-02-16T04:16:26.840 回答
9

当我创建一个类的新实例时,构造函数返回对哈希的祝福引用有什么意义?

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

我能理解“return (this);” 或类似的规定

那么有什么困惑呢?这正是您应该返回的内容。(除了约定叫它$self。)

sub new {
    my ($class, ...) = @_;
    my $self = bless({}, $class);  # Or: my $self = $class->SUPER::new(...);
    $self->{attribute1} = ...;
    $self->{attribute2} = ...;
    return $self;
}

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

祝福哈希该类的实例,也就是对象。


评论中的问题

为什么我必须 [do my $self = bless({}, $class);] 而不是仅仅引用类实例。像:$self = bless($class)

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

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

但在我看来,任何人都会制作的大多数对象都不会使用哈希。散列是一种非常具体的数据结构,99% 的编码都不需要或没有帮助。

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

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

于 2013-02-16T04:30:05.953 回答