您是否必须命名构造函数';新';在面向对象的Perl中?

您是否必须命名构造函数';新';在面向对象的Perl中?,perl,oop,Perl,Oop,我编写了一些面向对象的Perl,并使用new关键字作为构造函数的名称。如果我将new更改为car,它仍然可以工作 new是构造函数所需的预定义关键字,还是可以使用自己的构造函数名称?new不是关键字,它对Perl完全没有意义祝福是构建对象的方式。如果您想要一个名为load的构造函数,那没有问题car似乎不是一个好的构造函数名称选择。但正如你所说,它也能起作用。引用perlootut: 在Perl中,没有用于构造对象的特殊关键字。然而, CPAN上的大多数OO模块都使用名为“new()”的方法来构

我编写了一些面向对象的Perl,并使用
new
关键字作为构造函数的名称。如果我将
new
更改为
car
,它仍然可以工作


new
是构造函数所需的预定义关键字,还是可以使用自己的构造函数名称?

new
不是关键字,它对Perl完全没有意义<代码>祝福是构建对象的方式。如果您想要一个名为
load
的构造函数,那没有问题
car
似乎不是一个好的构造函数名称选择。但正如你所说,它也能起作用。

引用
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
。在本例中,除了打印之外,我们没有使用参数,但是如果您正在使用它们,您最好记录人们应该如何调用您的构造函数


另请参见此相关问题:

您可以使用任何名称作为其类的构造函数。但是,如果你不遵守这一惯例,总要想到别人或你自己可能遇到的困难,这是很好的

这是一个很好的练习,可以提高阅读他人编写的代码的理解力。值得注意的是,有许多方法(TMTOWTDI)可以编程面向对象的Perl。官方文件非常清晰和有用:并且Moose是推荐的方式,但还有许多其他方式,包括使用“原始”形式


如果您是以原语形式编程——不推荐使用——关键是在其构造函数中使用bless,名称对代码的功能没有影响,但对可读性和理解性很重要。

那么为什么大多数模块都使用新的关键字来创建对象,我们为什么不使用其他关键字呢?new中有什么特别的东西吗?因为当你看到
new
时,你知道它是一个构造函数。命名一个非构造函数<代码>新< /COD>将是一个很糟糕的事情,因为它会引起混乱,命名构造函数除了<代码>新< <代码>之外,只应该出于同样的原因而做。这是为了让C++和java程序员感觉他们知道什么正在发生。on@mob,我强烈反对。即使Perl是唯一的语言,也会形成一种惯例。@mob,选择
new
这个词是因为它在其他地方的使用是的,但仅使用
new
与安慰任何人无关。