MAIN() 函数:多重调度如何工作?

7st*_*tud 5 raku

示例1:

#!/usr/bin/env raku
use v6.d;

sub MAIN(Int $int) {
    say 'parameter $int: ', $int.^name;
}

--output:--
$ raku b.raku 10   
parameter $int: IntStr
Run Code Online (Sandbox Code Playgroud)

示例2:

#!/usr/bin/env raku
use v6.d;

sub MAIN(Str $str) {
    say 'parameter $str: ', $str.^name;
}

--output:--
$ raku b.raku 10   
parameter $str: IntStr

$ raku b.raku hello
parameter $str: Str

$ raku b.raku 10hello
parameter $str: Str

$ raku b.raku 6.5    
parameter $str: RatStr
Run Code Online (Sandbox Code Playgroud)

示例3:

#!/usr/bin/env raku
use v6.d;

multi sub MAIN(Int $int) {
    say 'parameter $int: ', $int.^name;
}

multi sub MAIN(Str $str,) {
    say 'parameter $str: ', $str.^name;
}

--output:--
raku b.raku 10     
Ambiguous call to 'MAIN(IntStr)'; these signatures all match:
  (Int $int)
  (Str $str)
  in block <unit> at b.raku line 2
Run Code Online (Sandbox Code Playgroud)

好吧,这对我来说很有意义:IntStr类型既匹配Int类型又匹配Str类型。(在 erlang/elixir 中,第一个匹配的函数子句将获胜。)

接下来,如果我向 MAIN() 的第二个子句添加一个可选参数,歧义就会消失:

示例4:

#!/usr/bin/env raku
use v6.d;

multi sub MAIN(Int $int) {
    say 'parameter $int: ', $int.^name;
}

multi sub MAIN(Str $str, Int $x?) {
    say 'parameter $str: ', $str.^name;
}


--output:--
raku b.raku 10
parameter $int: IntSt
Run Code Online (Sandbox Code Playgroud)

在这种情况下,执行第一个子句MAIN()。用什么规则来解释呢?

Eli*_*sen 6

因为第二个候选者可以有 2 个参数,所以它不如第一个候选者必须有一个参数那么严格。