Actually, you have it a bit backwards, get can see $!z just fine, it is the constructor which is not setting $!z (because it is private).
If you really want to allow setting a private attribute at object creation time you can use a BUILD submethod:
class Dot { has $.x; has $.y; has $!z; # Fancy syntax which simply sets each private variable. submethod BUILD(:$!x, :$!y, :$!z) { say "Initializing!"; } method get { return ($!x, $!y, $!z); } }; my $a = Dot.new(x => 23, y => 42, z => 2); say $_ for $a.get;
Notice that if you create BUILD you are responsible for handling all your attributes.
Though if $!z is private, you probably want to do some checking on it before setting (else, why is it private?). That can be done too by not using the special syntax:
# Blindly accept x and y, but do extra checks on z: submethod BUILD(:$!x, :$!y, :$z) { say "Initializing!"; die "z too big!" if $z > 10; $!z = $z; }
Of course, there are a million other ways to do validation of an attribute (some are better than this), just showing this way since it is relevant to your current investigations.
Update: Oh, and perl6 has a really smart say (ok, smart objects, but whatever), no need to loop anymore just for debugging statements: say $a.get works nicely (as does say $a.get.perl).
Good Day,
Dean
In reply to Re: Private attributes in Perl 6 objects
by duelafn
in thread Private attributes in Perl 6 objects
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |