Last active
December 20, 2020 02:38
-
-
Save jubilatious1/2adaaa1c6875edbd5624568e8979a62a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Foo1 { | |
has $!odd = 12; | |
has $!even = 24; | |
method AT-POS(\position) is rw { | |
position % 2 ?? $!odd !! $!even | |
} | |
} | |
say Foo1.new[10].VAR.name; # $!even | |
say Foo1.new[10].VAR.^name; #Scalar | |
#private | |
class Foo2 { | |
has $.odd = 12; | |
has $.even = 24; | |
method AT-POS(\position) is rw { | |
position % 2 ?? $!odd !! $!even | |
} | |
} | |
say Foo2.new[10].VAR.name; # $!even | |
say Foo2.new[10].VAR.^name; #Scalar | |
class Foo3 { | |
has $.odd = 12; | |
has $.even = 24; | |
method AT-POS(\position) is rw { | |
# no need to write this twice | |
my $alias := (position % 2 ?? $!odd !! $!even); | |
Proxy.new: | |
FETCH => method () { $alias }, | |
STORE => method ($new-value) { $alias = $new-value } | |
} | |
} | |
say Foo3.new[10].VAR; #24 | |
say Foo3.new[10].VAR.^name; #Proxy | |
class Foo4 { | |
has $.odd = 12; | |
has $.even = 24; | |
# has to be either `raw` or `rw` | |
# it is debatable of which is better here | |
method !attr(\position) is raw { | |
position % 2 ?? $!odd !! $!even | |
} | |
method AT-POS(\position) is rw { | |
my $alias := self!attr(position); | |
Proxy.new: | |
FETCH => -> $ { $alias }, | |
STORE => -> $, $new-value { $alias = $new-value } | |
} | |
} | |
say Foo4.new[10].VAR; #24 | |
say Foo4.new[10].VAR.^name; #Proxy | |
class Foo5 { | |
has $.odd = 12; | |
has $.even = 24; | |
method !attr(\position) is raw { | |
position % 2 ?? $!odd !! $!even | |
} | |
method AT-POS(\position) is rw { | |
self!attr(position); | |
} | |
} | |
say Foo5.new[10].VAR; #24 | |
say Foo5.new[10].VAR.^name; #Scalar | |
class Foo6 { | |
has $.odd = 12; | |
has $.even = 24; | |
method !attr(\position) is raw { | |
($!even,$!odd)[position % 2] | |
} | |
#Which would allow for a ternary data structure. | |
#method !attr(\position) is raw { | |
# ($!mod0,$!mod1,$!mod2)[position % 3] | |
# } | |
method AT-POS(\position) is rw { | |
self!attr(position); | |
} | |
} | |
say Foo6.new[10].VAR; #24 | |
say Foo6.new[10].VAR.^name; #Scalar |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment