Использование Perl и Moose
, доступ к объектным данным можно получить двумя способами.Запись в атрибуты только для чтения внутри класса Perl Moose
$self->{attribute}
или $self->attribute()
Вот простой пример, демонстрирующий, как:
# Person.pm
package Person;
use strict;
use warnings;
use Moose;
has 'name' => (is => 'rw', isa => 'Str');
has 'age' => (is => 'ro', isa => 'Int');
sub HAPPY_BIRTHDAY {
my $self = shift;
$self->{age}++; # Age is accessed through method 1
}
sub HAPPY_BIRTHDAY2 {
my $self = shift;
my $age = $self->age();
$self->age($age + 1); # Age is accessed through method 2 (this will fail)
}
1;
# test.pl
#!/usr/bin/perl
use strict;
use warnings;
use Person;
my $person = Person->new(
name => 'Joe',
age => 23,
);
print $person->age()."\n";
$person->HAPPY_BIRTHDAY();
print $person->age()."\n";
$person->HAPPY_BIRTHDAY2();
print $person->age()."\n";
Я знаю, что, когда вы находитесь за пределами файла Person.pm
, лучше использовать $person->age()
так как это мешает вам совершать немые ошибки и не позволит вам переписать значение только для чтения, но мой вопрос ...
Внутри из
Person.pm
это лучше всего использовать$self->{age}
или$self->age()
? Является ли неправильной практикой перезаписывать атрибут только для чтения в пределах сам модуль?Если этот атрибут должен быть изменен на атрибут чтения/записи, если его значение когда-либо ожидается изменить или считается приемлемым для переопределения аспекта атрибута только для чтения с использованием
$self->{age}
в функцииHAPPY_BIRTHDAY
?
Отличный ответ @friedo. Один вопрос, однако, что вы делаете, когда хотите установить атрибуты так условно: '$ person -> {age} = $ person-> is_baby()? 1: 52; '. Как вы делаете что-то подобное, следуя правильному формату «Moose»? – tjwrona1992
@ tjwrona1992, в этом случае я бы использовал метод ленивого построителя для атрибута «age». – friedo
Интересно, я посмотрю на ленивые методы построения. – tjwrona1992