我写了一些面向对象的Perl,我使用new
关键字作为构造函数的名称。如果我将new
更改为car
,它仍然有效。
new
是构造函数所需的预定义关键字,还是可以使用自己的构造函数名称?
答案 0 :(得分:8)
new
不是关键字,它对Perl完全没有意义。 bless
是构造对象的原因。如果你想要一个名为load
的构造函数,那没问题。 car
似乎不是构造函数名称的好选择。但正如你所说,它也有效。
答案 1 :(得分:1)
引用perlootut
:
在Perl中,没有用于构造对象的特殊关键字。然而, CPAN上的大多数OO模块使用名为“new()”的方法来构造新的 对象
我建议你通过运行以下perl程序来试验它是如何工作的:
#!/usr/bin/perl -w
use strict;
use warnings;
use feature qw/say/;
package A;
sub new { say "hello: @_"; bless [] }
package B;
sub new { say "world: @_"; bless [] }
sub old { say "hi: @_" };
package main;
# This prints 'hello: 1 2 3', since it calls directly the sub A::new
A::new(1,2,3);
# Equivalent forms, print 'hello: A 1 2 3'
new A(1,2,3);
A->new(1,2,3);
# Both forms call the A::new sub and pass a string "A" as first argument.
# The bareword B is used this time. Perl knows the B::new function
# must be called. "B" is passed as first parameter.
# This prints 'world B 1 2 3'
my $b = new B(1,2,3);
# Prints something similar to 'hi: B=ARRAY(0x16b7630) 4 5 6'
# A blessed reference always carries around as context information
# about its package.
$b->old(4,5,6);
# Equivalent
B::old($b, 4, 5, 6);
一旦你理解了这一点,就可以看到构造函数只是一个返回祝福引用的函数。你可以随意调用它。
注意A::new
和A->new
之间的区别非常重要,因为只有第二种形式使用包名作为第一个参数。根据原则,您的软件包的用户可以通过两种方式调用new
。在示例中,我们不使用除打印之外的参数,但如果您使用它们,则最好记录人们应该如何打电话给您的建设者。
另请参阅此相关问题:In Perl OOP, is there any official recommendations on initialisation within the constructor?
答案 2 :(得分:0)