我不明白为什么Perl构造函数需要所有这些祝福,以及为什么它总是使用哈希(显然可以使用其他变量类型)。
在创建类的新实例时,构造函数如何返回对哈希的祝福引用有何意义?我能理解“回归(这个);”或者某些东西,但返回一些其他随机变量只会使我神秘(特别是当你应该使用哈希)时。
my ?var = new Test("foo");
package Test;
our $localvar;
sub new{
localvar = $_[1];
}
好的,所以我有这个基础课。我可以在初始化时设置一个类变量,然后像$ var :: localvar一样使用它。但要实际编译并在Perl中工作,我需要添加“return bless {},shift;”???
似乎这个哈希被用作该类的实例,方法相当静态。但是你仍然可以拥有类变量。听起来您只是将数据对象链接到将该对象作为参数的方法列表。但我不确定为什么每个教程都会暗示你总是使用哈希,如果那就是发生的那样。我很困惑为什么你有这个哈希和你在课堂上声明的任何“我们”,它们看起来像是互相排斥的概念?
答案 0 :(得分:16)
听起来您只是将数据对象链接到将该对象作为参数的方法列表。
这正是OO的意思,是的。从构造函数返回的是实例。与其他语言不同,语言在幕后创建一个新的“对象实例”,而构造函数只负责填充插槽,在Perl中,构造函数方法可以完成整个工作。 {}
创建对新匿名哈希的引用,该哈希将成为对象的存储,bless
实际上将该引用转换为对象,方法是将其标记为班级名称。
但是我不确定为什么每个教程都会暗示你总是使用哈希,如果发生了这一切。
类可以是任何类型的引用,但哈希引用是最有用和方便的,因为哈希具有命名槽,因此您可以按名称引用对象的属性。有一些例子是globref对象(文件句柄和套接字),arrayref对象(很少见,通常用于当作者非常关心速度和内存使用时只有几个字段的对象),以及scalarref对象(通常用于封装一个一些C库返回的指针)。但hashref对象是“标准的”。
我可以在初始化时设置一个类变量,然后再使用它像?var :: localvar。
但你为什么要这样?类变量几乎完全无用,在你掌握更基本和有用的东西之前没有理由去理解它们。
答案 1 :(得分: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而不是hash。
但是在我看来,任何人都会做的大多数对象都没有用于哈希。哈希是一种非常特殊的数据结构,99%的编码都不需要或没有帮助。
关键是不要使用哈希表;它是使用关联数组(其中每个元素都是一个属性)。
关联数组(哈希表或其他)在远远超过1%的编码中都是“需要和有用的”。