At a quick glance, looks like a bug to me. Worth opening a ticket on https://github.com/rakudo/rakudo
Best regards, Vadim Belman > On Jan 12, 2020, at 8:15 PM, Joseph Brenner <doom...@gmail.com> wrote: > > Moving the definition of the subset outside of the class > covers for the weird behavior... > > my @allowed = << alpha beta gamma delta >>; > my @default = << alpha >>; > subset Allowed of Str where * eq any( @allowed ); > > class HasSubset { > has Allowed @.grk = @default; > method echo_grk { > say @!grk.join(" | "); > } > } > > my $obj = HasSubset.new(); > $obj.echo_grk(); > > my $obj2 = HasSubset.new( grk => << alpha beta gamma >> ); > $obj2.echo_grk(); > > my $obj3 = HasSubset.new( grk => << alpha beta rutabaga >> ); > $obj3.echo_grk(); > # value 'rutabaga' fails as expected: > # Type check failed in assignment to @!grk; expected > HasSubset::Allowed but got Str ("rutabaga") > > > On 1/12/20, Joseph Brenner <doom...@gmail.com> wrote: >> Here's a code snippet that tries to use a subset to constrain the >> values of an object field (i.e. declared with has). As written, this >> code works, but only when there's what looks like an irrelevant >> experimental line in it (labeled "WEIRD ONE"), when that line is >> commented out it throws an error... >> >> class HasSubset { >> my @allowed = << alpha beta gamma delta >>; >> my @default = << alpha >>; >> >> subset Allowed of Str where * eq any( @allowed ); >> >> my Allowed $experiment = 'delta'; # WEIRD ONE this line is >> *needed* to get the following to work... >> >> has Allowed @.greek = @default; >> >> method echo_greek { >> say @!greek.join(" | "); >> } >> } >> >> my $obj = HasSubset.new(); >> $obj.echo_greek(); >> >> # As written, prints the default: 'alpha' >> # Without the WEIRD ONE line, you see errors like: >> ## Type check failed in assignment to @!greek; expected >> HasSubset::Allowed but got Str ("alpha") >> >