我不明白为什么Perl构造函数需要所有这些祝福,以及为什么它总是使用哈希(显然可以使用其他变量类型).
当我创建一个类的新实例时,构造函数如何返回对哈希的祝福引用有什么意义呢?我能理解"回归(这个);" 或者沿着那些方向的东西,但返回一些其他随机变量只是让我神秘(特别是当你应该使用哈希)时.
my ?var = new Test("foo");
package Test;
our $localvar;
sub new{
localvar = $_[1];
}
Run Code Online (Sandbox Code Playgroud)
好的,所以我有这个基础课.我可以在初始化时设置一个类变量,然后像$ var :: localvar一样使用它.但是为了让它实际编译并在Perl中工作,我需要在行中添加"return bless {},shift;"???
看起来这个哈希被用作该类的实例,其方法相当静态.但是你仍然可以拥有类变量.听起来您只是将数据对象链接到将该对象作为参数的方法列表.但我不确定为什么每个教程都会暗示你总是使用哈希,如果那就是发生的那样.我很困惑为什么你有这个哈希和你在课堂上声明的任何"我们",它们看起来像互相排斥的概念?
hob*_*bbs 16
听起来您只是将数据对象链接到将该对象作为参数的方法列表.
这正是OO的意思,是的.从构造函数返回的是实例.与其他语言不同,语言在幕后创建一个新的"对象实例",而构造函数只负责填充插槽,在Perl中,构造函数方法可以完成整个工作.{}创建对新匿名哈希的引用,该哈希将成为对象的存储,并且bless实际上通过使用您的类名称将该引用转换为对象.
但我不确定为什么每个教程都会暗示你总是使用哈希,如果那就是发生的那样.
类可以是任何类型的引用,但哈希引用是最有用和方便的,因为哈希具有命名槽,因此您可以按名称引用对象的属性.有一些例子是globref对象(文件句柄和套接字),arrayref对象(很少见,通常用于当作者非常关心速度和内存使用时只有几个字段的对象),以及scalarref对象(通常用于封装一个一些C库返回的指针).但hashref对象是"标准的".
我可以在初始化时设置一个类变量,然后再使用它像?var :: localvar.
但你为什么要这样?类变量几乎完全没用,在你掌握更基本,有用的东西之前,没有理由去理它们.
当我创建一个类的新实例时,构造函数如何返回对哈希的祝福引用有什么意义呢?
好吧,如果你没有返回你创建的对象,那将是一个相当无用的构造函数.
我能理解"回归(这个);" 或类似的规定
然后是什么混乱?这正是你应该回归的.(除了惯例是召唤它$self.)
sub new {
my ($class, ...) = @_;
my $self = bless({}, $class); # Or: my $self = $class->SUPER::new(...);
$self->{attribute1} = ...;
$self->{attribute2} = ...;
return $self;
}
Run Code Online (Sandbox Code Playgroud)
似乎这个哈希被用作该类的实例,
受祝福的哈希是该类的实例,即对象.
为什么我必须[do
my $self = bless({}, $class);]而不是仅仅引用类实例.喜欢:$self = bless($class)
{}分配变量并将bless其与类关联.创建对象的两个必要步骤.
通过将两者分开,您可以选择为对象使用不同的基本变量.例如,IO :: Socket :: INET使用glob而不是hash.
但是在我看来,任何人都会做的大多数对象都没有用哈希.哈希是一种非常具体的数据结构,99%的编码不需要或没有帮助.
关键是不要使用哈希表; 它是使用关联数组(其中每个元素都是一个属性).
关联数组(哈希表或其他)在远远超过1%的编码中是"需要和有用的".