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只是一个包含变量和子例程的命名空间。
考虑到这一点,上面的代码来自Tutorial Point,这是在Perl中创建类时的最佳实践吗?
在其他OO语言中,当未设置值时,您可以从构造函数内部抛出异常,在Perl中也可以这样做吗?
这是保佑的正确方法吗?
教程点中的代码执行此操作:
bless $self, $class;
但是从perl文档:
my $self = bless {
path => $path,
data => $data,
}, $class;
return $self;
答案 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)
- 考虑到这一点,上面的代码来自Tutorial Point,正确 在Perl中创建类时的最佳实践?
醇>
Tutorial Point的代码没有任何内在错误。它创造了一个完美的课程。但是,正如其他人所指出的那样,Tutorial Point网站并没有得到高度重视,建议您到其他地方寻找更好的教程。
- 在其他OO语言中,您可以从内部抛出异常 没有设置值时的构造函数,也可以这样做 在Perl里面?
醇>
在Perl代码中,通过调用die()
抛出异常。您使用eval
并查看$@
的值来捕获异常。像Try::Tiny这样的模块可以使这个过程看起来更像其他语言。
- 哪个是正确的祝福方式?
醇>
Perl的口号是"其中有多种方式可以做到这一点"。你的两个代码示例都做同样的事情。选择一个而不是另一个的唯一理由是个人偏好和内部风格。
但是,许多Perl程序员已经放弃了这种OO编程风格,而是使用Moose(或其缩减关系Moo)来表示他们所有的OO代码。您可能会发现,查看这些选项可以让您的生活更轻松。