在Perl中创建一个类

时间:2016-01-21 17:17:19

标签: perl oop

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;
}

我从这个site获得了上述代码。

来自Classes官方Perl网站:

  

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

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

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

  3. 这是保佑的正确方法吗?

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

    bless $self, $class;
    

    但是从perl文档:

      my $self = bless {
          path => $path,
          data => $data,
      }, $class;
      return $self;
    

2 个答案:

答案 0 :(得分:5)

Perl没有对象构造函数。 new只是一种方法,方法可以抛出异常。

bless返回其第一个参数,所以

bless($ref, $class);
return $ref;

return bless($ref, $class);

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

就个人而言,我首先创建对象,然后添加到它。这将在基类

中的构造函数之间创建并行
sub new {
   my ($class, ...) = @_;
   my $self = bless({}, $class);
   $self->{...} = ...;
   return $self;
}

和子类中的构造函数

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

但这仅仅是我个人的偏好。

答案 1 :(得分:2)

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

Tutorial Point的代码没有任何内在错误。它创造了一个完美的课程。但是,正如其他人所指出的那样,Tutorial Point网站并没有得到高度重视,建议您到其他地方寻找更好的教程。

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

在Perl代码中,通过调用die()抛出异常。您使用eval并查看$@的值来捕获异常。像Try::Tiny这样的模块可以使这个过程看起来更像其他语言。

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

Perl的口号是"其中有多种方式可以做到这一点"。你的两个代码示例都做同样的事情。选择一个而不是另一个的唯一理由是个人偏好和内部风格。

但是,许多Perl程序员已经放弃了这种OO编程风格,而是使用Moose(或其缩减关系Moo)来表示他们所有的OO代码。您可能会发现,查看这些选项可以让您的生活更轻松。