in reply to Re^2: Raku classes: syntax question
in thread Raku classes: syntax question

That's a good question and a good answer. Raku (like perl) has some niceties as you dig in ... but the defaults are set at "easy"

Consider this...

use v6; class Point { has $.x is rw = 0; has $.y is rw = 0; method gist { "[$.x, $.y]" } method set( :$joe = $.x, :$susan = $.y ) { #method set( :$joe = $!x, :$susan = $!y ) { $.x = $joe; $.y = $susan; } } class Pixel is Point { has Int $.x is rw = 0; has Int $.y is rw = 0; has $.color = '#000000'; } my $point = Pixel.new(); #my $point = Point.new(); say $point.x; # 0 say $point; # [0, 0] # $point.x = 3; Error! $point = Pixel.new(x => 3, y => 5); #$point = Point.new(x => 3, y => 5); say $point; # [3,5] $point.set(joe => 10, susan => 20); say $point; # [10, 20] $point.set(joe => 100); say $point; # [100, 20]

The $!x / $!y variant does not work because it directly refers to the PRIVATE ATTR of the Point class. But, in this case, we have used inheritance to override the Point x/y with Pixel x/y. So, when you need to reach for inheritance then the $.x / $.y variants help ... since they are the same as saying self.x and self.y - ie. they route via the settor / getter METHODS.

We need the 'is rw' to ask raku to make a settor method so that $.x = $joe; $.y = $susan; can use the assignment operation to set attr values

Replies are listed 'Best First'.
Re^4: Raku classes: syntax question
by p6steve (Sexton) on Feb 05, 2024 at 22:25 UTC
    ...fwiw I would do this
    use v6; class Point { has $.x is rw = 0; has $.y is rw = 0; method gist { "[$.x, $.y]" } method set(:$x, :$y) { $.x = $x with $x; $.y = $y with $y; } } class Pixel is Point { has Int $.x is rw = 0; has Int $.y is rw = 0; has $.color = '#000000'; } my $point = Pixel.new(); say $point.x; # 0 say $point; # [0, 0] $point.x = 3; # Works now! $point = Pixel.new( :x(3), :y(5) ); say $point; # [3,5] $point.set( :x(10), :y(20) ); say $point; # [10, 20] $point.set( :x(100) ); say $point; # [100, 20]