in reply to Private attributes in Perl 6 objects
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
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Private attributes in Perl 6 objects
by Anonymous Monk on Nov 02, 2015 at 15:37 UTC | |
by duelafn (Parson) on Nov 02, 2015 at 23:11 UTC | |
by Anonymous Monk on Nov 03, 2015 at 09:17 UTC | |
by Arunbear (Prior) on Nov 03, 2015 at 11:11 UTC |