Okay, I opened a github issue:

  https://github.com/rakudo/rakudo/issues/3421



On 1/13/20, Vadim Belman <vr...@lflat.org> wrote:
> 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