a) I don't understand why the white space matters, but clearly it does.
So the token is '{*}' and not braces around a Whatever-star.
b) Removing the space yields the following response.
in string
Cannot resolve caller handle(NewClass:D: List:D); none of these
signatures match:
(NewClass: Str $s, *%_)
(NewClass: Positional @s, *%_)
in method handle at test.raku line 15
in block <unit> at test.raku line 30
Not sure why the List:D is not being matched to Positional. Is the
List:D refering to the |c signature capture ??
Since 'in string' was printed, one of the methods was reached. Confused.
c) Writing out all the code in each method is what I already have. But
I'm looking for ways to factor out common code.
Regards
On 29/06/2020 18:44, Fernando Santagata wrote:
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
<mailto: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 <mailto: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