对于以下多子脚本:
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;
我收到以下错误:
Ambiguous call to 'Screen_get_valid_string';
these signatures all match:
:($prompt, $accept_empty_string, $max_length = 999)
:($prompt, $max_length = 999)
我找到的唯一方法是使用命名参数:
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;
结果是:
return is abc
谢谢
P.S。在Perl5工作;新的Perl6
答案 0 :(得分:6)
您获得的错误是因为您设置了默认值。因此,解析器不知道您是否要求
$prompt = "enter value for string => "
$accept_empty_string = True
$max_length = 999
或者
$prompt = "enter value for string => "
$max_length = True
如果没有类型提示,那么从两个选项中的哪一个是正确的位置就无法判断。添加类型会有所帮助(正如JJ Merelo所建议的那样)。您还可以混合和匹配位置和命名参数,这可能有助于这种情况:
sub Screen_get_valid_string( $prompt,
:$max_length = 999,
:$accept_empty_string = False )
在这种情况下,你不需要多人。始终需要$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 )
注意Str()
接受任何强制攻击Str的东西。
答案 1 :(得分:3)
主要问题是,在Perl 6中,Bool
True
实际上是Int
类999
,所以即使你声明了它们的类型({{1}在签名中,将它们分开是很困难的。所以在这种情况下,Perl 6很难将它们分开。
但如果限制值
,仍然可以使用定位Bool $accept_empty_string
Int $max_length
有助于约束变量可能带来的值,这有助于消除多个选择的歧义。