约束multis及其用于选择它们

jjm*_*elo 3 perl6 dispatch

约束显然不用于选择一个 multi

multi sub cuenta( Str $str ) { say $str };
multi sub cuenta( $file where .IO.e ) { say $file.IO.slurp };
cuenta( $*PROGRAM-NAME ); # Outputs the file name
Run Code Online (Sandbox Code Playgroud)

这意味着它使用的是第一个,而不是第二个.但是,这可以按预期工作:

subset real-files of Str where .IO.e;
multi sub cuenta( Str $str ) { say $str };
multi sub cuenta( real-files $file ) { say $file.IO.slurp };
cuenta( $*PROGRAM-NAME );
Run Code Online (Sandbox Code Playgroud)

打印程序本身的内容.这可能说明了类型检查和多调度,但我不确定它是设计还是只是一个怪癖.任何的想法?

rai*_*iph 7

multi sub cuenta( Str $str ) { say $str };
multi sub cuenta( Str $file where .IO.e ) { say $file.IO.slurp };
                # ^^^
cuenta( $*PROGRAM-NAME ); # Outputs the file

subset real-files        where .IO.e;
                # ^^^^^^
multi sub cuenta( Str $str ) { say $str };
multi sub cuenta( real-files $file ) { say $file.IO.slurp };
cuenta( $*PROGRAM-NAME ); # Outputs the file name
Run Code Online (Sandbox Code Playgroud)

首先检查参数的基本类型以建立候选者.只有最窄的匹配multis才是发送的候选者.一个where约束只有在有具有相同的基本类型的多个匹配的候选人适用.如果未指定,参数或一个的基本类型subsetAny.

这是设计的.