Jestem absolutnym początkującym dla Moose
i do tej pory przeczytałem Moose
i większość Cookbook.Jak mogę uzyskać dostęp do atrybutów obiektów Moose tylko do odczytu?
Jest kilka rzeczy, których nie otrzymuję. I stworzył następujący pakiet:
package MyRange;
use Moose;
use namespace::autoclean;
has [ 'start', 'end' ] => (
is => 'ro',
isa => 'Int',
required => 1,
);
__PACKAGE__->meta->make_immutable;
1;
wówczas:
use MyRange;
my $br = MyRange->new(
start => 100,
end => 180
);
Teraz mogę uzyskać dostępu do pól przy użyciu np $br->{start}
, ale mogę również je modyfikować (chociaż są one "tylko do odczytu") za pomocą np. $br->{start}=5000
. Mogę też dodać nowe klucze, takie jak $br->{xxx}=111
.
Czy brakuje mi czegoś? Czy obiekt nie jest w jakiś sposób chroniony? Jakie jest znaczenie ro
?
+1 Dziękujemy! Kontynuacja, jeśli mogę: mam kilka pól, które nie są wymagane. Jeśli nie są ustawione i próbuję uzyskać dostęp do tych wartości 'undef', chciałbym uzyskać błąd. Czy powinienem ustawić czytnik dla każdego z nich? A może użyć jakiejś podobnej do '' '' '' '' '' '' '' '' '' '' '' '' '' ' –
Możesz utworzyć nowe pytanie, aby uzyskać bardziej szczegółową odpowiedź na ten temat, ale: Czy masz projekt, w którym początkowo wartości nie są wymagane, ale użytkownik może je później wypełnić za pomocą metod pisarza i musi to zrobić przed wywołaniem niektóre funkcje, które go używają? Przez większość czasu powinieneś przemyśleć swój projekt, ale w rzadkich przypadkach, gdy ma to sens, moje rozszerzenie 'MooseX :: LazyRequire' może być pomocne.Wszystko, co robi, to uczynienie wymaganego atrybutu, ale odroczenie wyjątku od czasu budowy do czasu dostępu do atr. – rafl
Zauważ też, że możesz poprosić Moose'a o wygenerowanie dla ciebie metod 'predicate'. Te, których można użyć do jawnego sprawdzenia, czy wartość została ustawiona dla jakiegoś atrybutu za pomocą metod konstruktora lub programu piszącego. Jest to szczególnie przydatne w przypadku atrybutów, które nie są wymagane i dla których 'undef' jest poprawną wartością. – rafl