约束显然不用于选择一个 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)
打印程序本身的内容.这可能说明了类型检查和多调度,但我不确定它是设计还是只是一个怪癖.任何的想法?
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约束只有在有具有相同的基本类型的多个匹配的候选人适用.如果未指定,参数或一个的基本类型subset是Any.
这是设计的.