This disconnect here, is that Mikkel (OP) wants the Str type constraint for
the file list. Which still works with the @ sigil-

> my Str @more_files; @more_files.push('one.file','two.file');
[one.file two.file]

> @more_files.push(99)
Type check failed in assignment to @more_files; expected Str but got Int
(99)

> .say for @more_files # concise, though doesn't show the Str-ness
one.file
two.file

> for @more_files -> Str $f { $f.say }
one.file
two.file

-y

-y


On Wed, Feb 13, 2019 at 5:59 AM Brad Gilbert <b2gi...@gmail.com> wrote:

> The problem with `$files` is the `$`
>
> When a `for` loop sees something that is itemized / containerized
> (`$`) it treats it as a singular value.
>
>     my @a = 1,2,3;
>     my $a = @a;
>
>     for @a { .say }
>     # 1
>     # 2
>     # 3
>
>     for $a { .say }
>     # [1 2 3]
>
>     for @a.item { .say }
>     # [1 2 3]
>
> To get it to not see the `$` you have to do something
>
>     for $a.list {…}
>     for @$a {…}
>
>     for $a<> {…} # decontainerize
>     for $a.sefl {…} # ditto
>
> On Wed, Feb 13, 2019 at 6:30 AM Mikkel <mikkelst...@gmail.com> wrote:
> >
> > Hello. (recurring noob-question here)
> >
> > I seem always seem to get myself confused with Arrays/Typed Arrays. Can
> I ask of you to explain why the 'for' loop does not work without .flat? It
> seems so counter intuitive....
> >
> > > my Array[Str] $files;
> > (Array[Str])
> >
> > > $files.push("Test");
> > [Test]
> >
> > > $files.push("Test 2");
> > [Test Test 2]
> >
> > > for $files -> Str $f {.say}
> > Type check failed in binding to parameter '$f'; expected Str but got
> Array[Str] (Array[Str].new("Test", "Test 2"))
> >   in block <unit> at <unknown file> line 1
> >
> > Best regards
> > Mikkel Birkedam
>

Reply via email to