考虑这些子程序都采用一个命名参数.命名参数应该是可选的,我没有看到任何说法有例外.
没有类型限制,没有问题; 命名参数不是必需的.使用可以接受类型对象的类型约束(没有注释:U,和:_),没有问题.
Parameter '$quux' of routine 'quux' must be an object instance of type 'Int',
not a type object of type 'Int'. Did you forget a '.new'?
in sub quux at /Users/brian/Desktop/type.p6 line 16
in block <unit> at /Users/brian/Desktop/type.p6 line 37
Run Code Online (Sandbox Code Playgroud)
对于需要定义值(带注释:D)的类型约束,命名参数不再是可选的.也就是说,对于任何其他定义,我不必提供值.随着:D我必须提供一个值.我宁愿不遗漏,:D因为我想要的价值必须定义.
来自签名文档:
通常,类型约束仅检查传递的值是否是正确的类型.
但是,我没有传递任何价值.我认为这些约束只对作业有影响.因为我没有明确地提供一个值来分配我期望没有任何分配也没有问题.Rakudo 2017.10的情况并非如此.这导致我以各种令人讨厌的方式解决这个问题.这与我的问题有关Perl 6块是一个参数还是没有?我试图区分零和一个参数的情况.
我可以通过分配默认值来解决这个问题,但在某些情况下,没有默认值是有意义的.Bool例如,A 很容易,但确定的Int是什么?无论是什么,都会有一些神奇的价值,会使代码变得复杂和分散注意力.我已经完成了这个,Perl 6有一个Infinite Int,但我侥幸逃脱,因为Inf在这种情况下作为有效值.
sub foo ( :$foo ) { …Run Code Online (Sandbox Code Playgroud)