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 <[email protected]> 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 <[email protected]> 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
>