Before I get started here, a small point about defining hashes.
There are various ways that work:

    my %h1 = ( 'ha' => 1, 'ho' => 2, 'hum' => 3 );
    my %h2 = (  ha  => 1,  ho  => 2,  hum  => 3 );
    my %h3 =  ha  => 1,  ho  => 2,  hum  => 3;
    my %h4 = 'ha' => 1, 'ho' => 2, 'hum' => 3;

    say join(' ',
             %h1{'ho'}, %h2{'ho'}, %h3{'ho'}, %h4{'ho'}
             );
    # Output: 2 2 2 2

Of course, when you're accessing the hash value, the key *does* need
to be quoted (unlike in perl), And because of this, I keep
thinking I need to quote keys (as in %h1 or %h4), though really
the pair operator does implicit quoting on the left (so %h2
and %h3 work and would usually be preferred).

By the way, I do know about this idiom:

    say join(' ',
             %h1<ho>, %h2<ho>, %h3<ho>, %h4<ho>
            );
    # Output: 2 2 2 2

Now, on to my main point...

I was wondering what sub signature invocation gives you behavior like
the standard "new" method, which takes a series of named arguments:

I see in Mu.pm6 there's this:

    multi method new(*%attrinit) {

And here in an article by Elizabeth Mattijsen I see:

    https://opensource.com/article/18/9/signatures-perl-6

    If you want to catch any (other) named arguments, you can use a
    so-called "slurpy hash." Just like the slurpy array, it is
     indicated with an asterisk before a hash:

        sub slurp-nameds(*%nameds) {
            say "Received: " ~ join ", ", sort keys %nameds;
        }
        slurp-nameds(foo => 42, bar => 666); # Received: bar, foo

I find that if I very carefully imitate that in every detail, it
works fine:

    sub genius(*%fried) { say %fried };
    genius( ha => 1, ho => 2, hum => 3 );
    ## Output: {ha => 1, ho => 2, hum => 3}


But as I mentioned earlier, I often quote keys without thinking
about it:

    genius( 'ha' => 1, 'ho' => 2, 'hum' => 3 );
    ## Error: Too many positionals passed; expected 0 arguments but got 3

So: when passing pairs to a sub, quoting the key causes
things to barf, and the messaging is seriously LTA.

(The pair operator is being demoted to a fat comma?)


Incidently, the "slurpy hash" is discussed in the docs, where
they're called "slurpy named arguments". That's under "Slurpy
parameters" here https://docs.raku.org/type/Signature
Elizabeth's examples are clearer, I think.

Reply via email to