来自新手用户的第一篇文章。我用google询问的每个问题似乎都把我带到这里,而且我总是对自己要找的东西有很好的回答;因此,当我开始思考在Perl中使用祝福时,这自然是我的第一站。
我刚进入Perl的OOP,今天才读到这篇帖子,问祝福有什么用。我现在知道,它引用标量/哈希/数组到对象,如果可以的话,可以“附加”它。
在我在Perl中看到的大多数类示例中,它们似乎没有像我以前在其他语言中看到的那样具有属性。
{ package Person;
my $property = "This is what I'm talking about :)";
sub new { ... }
...
}
因此,我创建了一个带有属性的愚蠢类,以了解会发生什么。我马上就给了属性值“NIL”,然后是“Not Nil!”。在构造函数中。使用LIST方法,我能够打印该属性,并且如我所料,它打印了“Not Nil!”。
我的问题是,如果属性的工作方式与我预期的相同(在主体中声明),那么为什么要完全使用bless?当您可以简单地将标量/哈希/数组作为属性创建,或将所需的任何引用作为属性创建时,具有该引用的附加好处是什么?
我希望我解释了我要问的问题,Perl非常环保:)
最佳答案
好吧,这不是在Perl中创建类的方式。
您的$property
变量是在包范围内定义的。因此,每个类只有一个副本,而不是每个对象都有自己的副本。
可以使用基于哈希的对象的冗长而艰巨的方法来实现这样的类,如下所示:
#!/usr/bin/perl
package Person;
use strict; use warnings;
sub new {
my $class = shift;
my $self = {};
bless $self => $class;
my ($arg) = @_;
for my $property ( qw( message ) ) {
if ( exists $arg->{$property} ) {
$self->$property($arg->{$property});
}
}
return $self;
}
sub message {
my $self = shift;
return $self->{message} unless @_;
my ($msg) = @_;
$self->{message} = $msg;
}
package main;
my $person = Person->new({
message => "This is what I'm talking about :)"
});
print $person->message, "\n";
现在,这变得非常乏味。因此,有一些模块可以帮助您处理这些问题,并帮助您以对继承安全的方式定义类。
Class::Accessor是一种这样的实用程序模块。
对于启动时间不成问题的程序,应考虑使用Moose。使用Moose,您可以将以上内容编写为:
#!/usr/bin/perl
package Person;
use Moose;
has 'message' => (is => 'rw', isa => 'Str');
__PACKAGE__->meta->make_immutable;
no Moose;
package main;
my $person = Person->new({
message => "This is what I'm talking about :)"
});
print $person->message, "\n";
您应该阅读perldoc perltoot和Moose::Manual::Unsweetened了解标准的处理方式。
关于perl - 祝福还是不祝福,这是我的问题!,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3454995/