Subset types are not object types.
A subset is basically a bit of checking code and base type associated with
a new type name.
In something like:
my ABC $a .= new;
That is exactly the same as:
my ABC $a = ABC.new;
Well there is no functional `.new` method on any subset types, so
`DEF.new()` isn't going to do anything.
DEF.new # ERROR
---
The worst part of your code is that you are using a `subset` without a
`where` clause. Which is almost completely pointless.
I honestly think that there is an argument to be made that it shouldn't
even be possible to write a `subset` without a `where` clause.
It isn't like other languages where you can create something like a
lightweight clone or lightweight subclass of a type.
It also isn't an alias.
It's whole purpose is to attach a `where` clause as an extra check to type
based things.
If you want an alias, use an alias
my constant DEF = ABC;
my constant DEF = ABC:D;
If you want a lightweight subclass, create a lightweight subclass.
my class DEF is ABC {}
If you want an extra check, then and only then does it make sense to use a
`subset`.
my subset GHI of Int where -10 ≤ $_ ≤ 10;
---
A `subset` without a `where` clause only makes certain language features
become unavailable.
Unless that is exactly what you want to accomplish, use something else.
On Fri, Jul 10, 2020 at 3:18 PM Marcel Timmerman <[email protected]> wrote:
> Hi,
>
> Using the next code I get an error on the instantiation of $d2;
>
> ---
> use v6;
>
> class ABC {
> method s ( Int $i ) { say $i + 10; }
> }
>
> subset DEF of ABC;
>
> my ABC $a .= new;
> $a.s(10); # 20
>
> my DEF $d1 = $a;
> $d1.s(11); # 21
>
> my DEF $d2 .= new;
> $d2.s(12);
> ---
>
> Error is
>
> You cannot create an instance of this type (DEF)
> in block <unit> at xt/subset-test.pl6 line 15
>
> Why is this?
>
> Regards,
> Marcel
>