Perl6; 多子

pca*_*ier 8 signature perl6

对于以下多子脚本:

multi sub Screen_get_valid_string($prompt, $accept_empty_string, $max_length = 999) { return "abc" }
multi sub Screen_get_valid_string($prompt, $max_length = 999)                       { return "def" }

my $return = Screen_get_valid_string("enter value for string => ", True);

say 'return  is ', $return;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Ambiguous call to 'Screen_get_valid_string';
these signatures all match:
:($prompt, $accept_empty_string, $max_length = 999)
:($prompt, $max_length = 999)
Run Code Online (Sandbox Code Playgroud)

我发现有一个正确的多子调用的唯一方法是使用命名参数:

multi sub Screen_get_valid_string(:$prompt, :$accept_empty_string, :$max_length = 999) { return "abc" }
multi sub Screen_get_valid_string(:$prompt, :$max_length = 999)                        { return "def" }


my $return = Screen_get_valid_string(prompt => "enter value for string => ", accept_empty_string => True);

say 'return  is ', $return;
Run Code Online (Sandbox Code Playgroud)

结果是:

return  is abc
Run Code Online (Sandbox Code Playgroud)

谢谢

ps在Perl5中工作; Perl6的新手

Sci*_*mon 6

您获得的错误是因为您设置了默认值.因此,解析器不知道您是否要求

$prompt = "enter value for string => "
$accept_empty_string = True
$max_length = 999
Run Code Online (Sandbox Code Playgroud)

要么

$prompt = "enter value for string => "
$max_length = True
Run Code Online (Sandbox Code Playgroud)

由于没有类型提示,因此无需从两个选项中的哪个选项正确判断.添加类型会有所帮助(正如JJ Merelo所建议的那样).您还可以混合和匹配位置和命名参数,这可能有助于这种情况:

sub Screen_get_valid_string( $prompt, 
                             :$max_length = 999, 
                             :$accept_empty_string = False ) 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您不需要多个.$prompt始终是必需的,另外两个是具有默认值的标志.

最近我在LPM上发表了关于签名的各种选项的演讲,这可能会有所帮助.

https://www.youtube.com/watch?v=obYlOurt-44

当然,你可以通过以下方式进行整体生猪:

sub Screen_get_valid_string( Str() $prompt, 
                             Int :$max_length = 999, 
                             Bool :$accept_empty_string = False ) 
Run Code Online (Sandbox Code Playgroud)

注意Str()接受任何强制转向Str的东西.


jjm*_*elo 3

主要问题是,在 Perl 6 中,Boollike实际上是likeTrue的类型,因此即使您在签名中声明它们的类型 ( , ),也很难将它们分开。所以在这种情况下,Perl 6 很难将它们分开。Int999Bool $accept_empty_stringInt $max_length

但如果您限制值,您仍然可以使用 Positionals

multi sub Screen_get_valid_string($prompt, 
                                  $accept_empty_string where True|False, 
                                  $max_length = 999) { 
    return "abc" 
}
multi sub Screen_get_valid_string($prompt, $max_length = 999) { 
   return "def" 
}

my $return = Screen_get_valid_string("enter value for string => ", True);

say 'return  is ', $return; # writes "return is  abc"
Run Code Online (Sandbox Code Playgroud)

where有助于限制变量可能取的值,这有助于消除 multi 选择的歧义。

  • 请注意,“where $_ == True|False”可以简单地为“where True|False” (4认同)