在Perl中创建一个类

Emm*_*een 2 oop perl

package Person;
sub new
{
    my $class = shift;
    my $self = {
        _firstName => shift,
        _lastName  => shift,
        _ssn       => shift,
    };
    # Print all the values just for clarification.
    print "First Name is $self->{_firstName}\n";
    print "Last Name is $self->{_lastName}\n";
    print "SSN is $self->{_ssn}\n";
    bless $self, $class;
    return $self;
}
Run Code Online (Sandbox Code Playgroud)

我从这个网站得到了上面的代码.

从Classes官方Perl站点:

Perl没有为类定义提供任何特殊语法.包只是一个包含变量和子例程的命名空间.

  1. 考虑到这一点,上面的代码来自Tutorial Point,这是在Perl中创建类时的最佳实践吗?

  2. 在其他OO语言中,当没有设置值时,你可以从构造函数内部抛出异常,在Perl中也可以这样做吗?

  3. 哪个是正确的祝福方式?

教程点中的代码执行此操作:

bless $self, $class;
Run Code Online (Sandbox Code Playgroud)

但是从perl文档:

  my $self = bless {
      path => $path,
      data => $data,
  }, $class;
  return $self;
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 5

Perl没有对象构造函数.new就像任何其他方法一样,方法可以抛出异常.


bless 返回它的第一个参数,所以

bless($ref, $class);
return $ref;
Run Code Online (Sandbox Code Playgroud)

return bless($ref, $class);
Run Code Online (Sandbox Code Playgroud)

是等价的.两者都是正确的.


就个人而言,我首先创建对象,然后添加到它.这将在基类中的构造函数之间创建并行

sub new {
   my ($class, ...) = @_;
   my $self = bless({}, $class);
   $self->{...} = ...;
   return $self;
}
Run Code Online (Sandbox Code Playgroud)

和子类中的构造函数

sub new {
   my ($class, ...) = @_;
   my $self = $class->SUPER::new(...);
   $self->{...} = ...;
   return $self;
}
Run Code Online (Sandbox Code Playgroud)

但这只是我个人的偏好.