gpt4 book ai didi

types - 为什么将 Perl 6 命名参数限制为一个确定的值使其成为必需值?

转载 作者:行者123 更新时间:2023-12-04 00:55:42 27 4
gpt4 key购买 nike

考虑这些都采用单个命名参数的子例程。命名参数应该是可选的,我没有看到任何可以说有异常(exception)的内容。

没有类型限制就没有问题;命名参数不是必需的。使用可以接受类型对象的类型约束(无注释, :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

对于需要定义值(用 :D 注释)的类型约束,命名参数不再是可选的。也就是说,对于任何其他定义,我不必提供值。带 :D我必须提供一个值。我宁愿不遗漏 :D因为必须定义我想要的值。

来自 Signatures文档:

Normally, a type constraint only checks whether the value passed is of the correct type.



但是,我没有传递任何值(value)。我认为这些约束只对作业有影响。由于我没有明确提供要分配的值,因此我预计不会有任何分配也没有问题。 Rakudo 2017.10 并非如此。这使我以各种令人讨厌的方式解决此问题。这与我的问题 Is that one argument or none for a Perl 6 block?有关我试图区分零个和一个参数的情况。

我可以通过分配默认值来解决这个问题,但在某些情况下,没有有意义的默认值。一个 Bool例如,这很容易,但是确定 Int会适合吗?无论它是什么,都会有一些神奇的值(value),会使代码复杂化和分散注意力。我已经用 Does Perl 6 have an Infinite Int 做到了这一点但我逃脱了,因为 Inf在这种情况下作为有效值。
sub foo ( :$foo ) {
put $foo.defined ?? 'foo defined' !! 'foo not defined';
}

sub bar ( Int :$bar ) {
put $bar.defined ?? 'bar defined' !! 'bar not defined';
}

sub baz ( Int:U :$baz ) {
put $baz.defined ?? 'baz defined' !! 'baz not defined';
}

sub quux ( Int:D :$quux ) {
put $quux.defined ?? 'quux defined' !! 'quux not defined';
}

sub quack ( Int:_ :$quack ) {
put $quack.defined ?? 'quack defined' !! 'quack not defined';
}

foo();
foo( foo => 2 );

bar();
bar( bar => 2 );

baz();
baz( baz => Int );

quack();
quack( quack => 2 );

quux( quux => 2 );
quux();

最佳答案

所有参数总是有一些值,即使它们是可选的。我澄清了您在 379678 中引用的文档和 b794a7 .

可选参数的默认默认值是显式或隐式类型约束的类型对象(隐式约束为 Any 用于例程,Mu 用于块)。

sub (Int $a?, Num :$b) { say "\$a is ", $a; say "\$b is ", $b }()
# OUTPUT:
# $a is (Int)
# $b is (Num)

上面,默认默认值传递参数的类型约束。如果您使用 :U,情况也是如此。或 :_键入笑脸。

但是,当您使用 :D 时类型笑脸,默认默认不再匹配类型约束。如果不选中它,您将失去指定 :D 的好处。约束。例如,由于默认的默认类型对象会导致此例程的主体发生爆炸,从而期望参数为确定的值。
sub (Int:D $a?, Num:D :$b) { say $a/$b }()

并回答是否指定 :D 的名义问题应该自动需要参数。我对这个想法是 -1,因为它引入了一种特殊情况,用户将不得不学习只保存一个输入字符( ! 以根据需要标记参数)。这样做还会产生一个不太有用的错误,它讨论了arity 或必需参数,而不是实际问题:参数的默认默认值未通过参数的类型检查。

关于types - 为什么将 Perl 6 命名参数限制为一个确定的值使其成为必需值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48166325/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com