新手用户的第一篇文章。我在谷歌上搜索的每一个问题似乎都会把我带到这里,而且我总是能得到很好的答案。所以当我开始思考 Perl 中祝福的用法时,很自然这是我的第一站。
我刚刚进入 Perl 的 OOP,今天刚刚阅读了帖子,询问 bless 是做什么的。我现在明白它引用了一个标量/哈希/数组到一个对象,如果你愿意的话,“附加”它。
在我在 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/