Skip to content

Instantly share code, notes, and snippets.

@jubilatious1
Last active December 20, 2020 02:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jubilatious1/2adaaa1c6875edbd5624568e8979a62a to your computer and use it in GitHub Desktop.
Save jubilatious1/2adaaa1c6875edbd5624568e8979a62a to your computer and use it in GitHub Desktop.
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