On Sun, Jun 07, 2020 at 09:04:45AM -0500, Brad Gilbert wrote: > On Sun, Jun 7, 2020 at 3:15 AM ToddAndMargo via perl6-users < > perl6-us...@perl.org> wrote: > > > Hi All, > > > > Dumb question: > > > > Does the "multi" in "multi method" mean there > > is more than one way to address a method? > > > > Or, are the all methods "multi methods". > > > > If not and the method is a multi, should not the > > documentation show all (more than one) the ways of > > addressing a multi method? > > There are four different types of a function. (both method and sub) > > - `multi` > - `proto` > - `only` > - `anon` > > A `proto` function is mainly just to declare there will be multiple > functions with same name. > `multi` is short for "multiple", meaning more than one. > `only` is the default, it means there is only one. > `anon` is for creating a lambda. (You only need it if you give the function > a name.) > > Again this applies to both subs and methods. > (Also `regex`, `token`, and `rule`. As they are just special methods.) > > only sub foo (){} > only sub foo (1){} # ERROR: redeclaration > # note that `only` is optional, as it is the default. > > proto sub bar (|){*} > multi sub bar (){} > multi sub bar (1){} > # note that defining a `proto` function is optional > > my $var = anon sub baz (){ 'fuzz' }; > say baz(); # ERROR: can't find a sub named `baz` > say $var(); # fuzz > say $var.name; # baz
I believe, though I'm not sure, that Todd may be referring to one of the questions that came up in a longish recent thread, namely the fact that the documentation of Str.starts-with() seems to only document it as a Str method, while Raku seems to disagree: [roam@straylight ~]$ raku -e 'my Str $x; $x.starts-with("a")' Cannot resolve caller starts-with(Str:U: Str:D); none of these signatures match: (Cool:D: Cool:D $needle, :i(:$ignorecase)!, :m(:$ignoremark), *%_ --> Bool) (Cool:D: Cool:D $needle, :m(:$ignoremark)!, *%_ --> Bool) (Cool:D: Cool:D $needle, *%_ --> Bool) (Str:D: Str:D $needle, :i(:$ignorecase)!, :m(:$ignoremark), *%_ --> Bool) (Str:D: Str:D $needle, :m(:$ignoremark)!, *%_ --> Bool) (Str:D: Str:D $needle, *%_ --> Bool) in block <unit> at -e line 1 [roam@straylight ~]$ So it seems that Cool has a .starts-with() method too, and this is borne out by a further experiment: [roam@straylight ~]$ raku -e 'my Cool $x; $x.starts-with("a")' Cannot resolve caller starts-with(Cool:U: Str:D); none of these signatures match: (Cool:D: Cool:D $needle, :i(:$ignorecase)!, :m(:$ignoremark), *%_ --> Bool) (Cool:D: Cool:D $needle, :m(:$ignoremark)!, *%_ --> Bool) (Cool:D: Cool:D $needle, *%_ --> Bool) in block <unit> at -e line 1 [roam@straylight ~]$ So the truth is that I do not fully understand why the documentation does not list .starts-with() as a method for Cool as well as Str: in https://docs.raku.org/routine.html "starts-with" is listed as "from Str", while there are other methods that are listed as "from Cool, Str", e.g. "subst". Now, yeah, I understand that Str.starts-with() defines a coercion for its $needle argument that means that Cool.starts-with() will never be called for an invocant that is either a Str or of any type derived from Str, no matter what $needle is - if it is from another Cool-derived type, it will be coerced to Str and Str.starts-with() will be called. However, should the documentation not mention that another type derived from Cool will also have a .starts-with() method? Please note that I'm not criticizing the documentation, automatically generated or not, or the efforts of everyone involved in producing it :) I am under the impression that it is, at least to some extent, automatically generated, so I'm genuinely curious what is it about the .starts-with() method that has caused it to lose its Cool :) ...and, of course, it may turn out that Todd meant something completely different in this particular message and I hijacked the thread... G'luck, Peter -- Peter Pentchev r...@ringlet.net r...@debian.org p...@storpool.com PGP key: http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint 2EE7 A7A5 17FC 124C F115 C354 651E EFB0 2527 DF13
signature.asc
Description: PGP signature