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")
>> 
> 

Reply via email to