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;
我收到以下错误:
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
谢谢
ps 在 Perl5 中工作;Perl6 的新手
解决方案
您收到的错误是因为您设置了默认值。因此,解析器不知道您是否要求
$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 的内容。
推荐阅读
- azure - Azure 托管的 SQL Server 可以与 Azure Cosmos DB 连接吗?
- typescript - Ionic3 上的 Firebase 存储和 Firestore 的异步功能问题
- c# - 在c#中合并音频和视频?
- python - 寻找最佳模型并将其信息放入新列
- c# - 如何检测电报 TLSharp 上已编辑或已删除的消息
- ruby-on-rails - 构建带有docker的rails容器没有被复制公共文件夹下的所有文件
- ios - Taptic Engine 平滑反馈
- ffmpeg - FFMPEG DASH - 实时流式传输 MP3 剪辑序列
- xquery - XQuery 根据不同的值获取数据
- javascript - Javascript:打印 JSON 树中的所有路径,包括数组