After deleting the spaces as suggested, there's a "Positional" too many.
I guess you can rewrite that method declaration as

multi method handle(@s)

or

multi method handle(Positional $s)

and adjust the method's body.

On Mon, Jun 29, 2020 at 7:37 PM yary <not....@gmail.com> wrote:

> It looks like you have spaces in the token { * } can you try it without,
> using this {*} instead?
>
> On Mon, Jun 29, 2020, 1:29 PM Richard Hainsworth <rnhainswo...@gmail.com>
> wrote:
>
>> I have several multi methods.
>>
>> All of them have the same first statement, then differ depending on the
>> signature.
>>
>> proto seems to be a way to factor out the common statement, and there is
>> a phrase in the Documentation that * can affect the dispatch, viz:
>>
>> "You can give the proto a function body, and place the {*} where you
>> want the dispatch to be done. This can be useful when you have a "hole" in
>> your routine that gives it different behavior depending on the arguments
>> given:"
>>
>> The docs give and example proto, but unfortunately, not how this works
>> with other multi's.
>>
>> So  I tried this:
>>
>> class NewClass {
>>     has $.debug is rw = False;
>>     has $.value is rw = 'Initial value';
>>
>>     proto method handle( |c ) {
>>         note "value is $.value" if $.debug;
>>         { * }    }
>>     multi method handle(Str $s) {
>>         $.value = $s;
>>         say 'in string'    }
>>     multi method handle(Positional @s) {
>>         $.value = @s[0];
>>         say 'in positional'    }
>> }
>> my NewClass $x .= new;
>> $x.handle('hello world');$x.handle(<hello world>);$x.debug = 
>> True;$x.handle('hello world');$x.handle(<hello world>);
>>
>> #raku test.raku
>> #value is Initial value
>> #value is Initial value
>>
>> I am wondering how to use proto and {*}
>>
>>

-- 
Fernando Santagata

Reply via email to