Kei*_*rdy 14 documentation raku
“类签名”页面上的示例显示为:
sub named(:official($private)) { "Official business!" if $private }; named :official;
<----- 注意:示例到此结束...没有描述或显示输出。所以我输入了代码,当执行“named”方法时,它总是打印“官方业务!” 无论 $private 的值是多少。也就是说,如果 $private=True 则调用 'named' 会打印“Official Business!” 正如您所期望的,但使用 $private=False 调用“named”仍然会打印“Official Business!” 而我认为不应该生成任何输出。我错过了一些东西,不是吗?但是什么?
我看到文档示例是多么令人困惑。这是该解释的扩展版本:
\nsub named(:official($private)) {\n # Inside the function, the argument the caller passed in\n # is bound to the variable $private. Nothing is bound to official.\n say $private;\n}\n\n# Outside the function, the caller doesn\'t need to care what term the \n# function uses. All it needs to know is the name of the parameter \xe2\x80\x93 :official\nnamed(:official(\'foo\')); # OUTPUT: \xc2\xabfoo\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n当函数位于不同的模块 \xe2\x80\x93 中时,这尤其方便,函数的所有者可以重构其参数的名称,$private而不会破坏任何外部调用者。而且,如果他们想到一个更好的名称供外部调用者使用,他们甚至可以在不破坏向后兼容性的情况下添加该名称sub named(:official(:better-name(:$private))) { \xe2\x80\xa6 }:让调用者使用:official或:better-name作为参数名称,而不会对函数内的变量名称产生任何影响。
这更有意义吗?
\n哦,还有一个关于这一点的注释:
\n\n\n如果 $private=True 则调用 \'named\' 打印“官方业务!” 正如你所期望的
\n
如果我理解正确的话,你的意思是写类似的东西
\nsub named(:official($private)=True) { "Official business!" if $private }\nRun Code Online (Sandbox Code Playgroud)\n这是你的意思吗?如果是这样,您应该知道$private=True在该签名中并没有真正设置 $private任何内容 \xe2\x80\x93 它只是为变量提供默认值$private。所以你可以得到这个输出:
sub named(:official($private)=True) { "Official business!" if $private }\nRun Code Online (Sandbox Code Playgroud)\n无论如何,我都会向文档存储库发送 PR,并尝试稍微澄清一下命名参数示例。希望您喜欢 Raku!
\n在这个简短的例子中发生了一些事情:
sub named(:official($private)) { "Official business!" if $private }
-------- --------
| |
| > '$private' is the name of this var within the sub
|
> 'official' is the (sigilless) name of this var outside
------------------
|
> ':official($private)' is the
raku Pair 'official => $private'
named :official
----- ---------
| |
| > the raku Pair 'official => True' (so $private ~~ True)
|
> the same as 'named( official => True );'
Run Code Online (Sandbox Code Playgroud)
所以当你在repl中尝试这个时...
> named :official; #Official business!
> named( official => True ) #Official business! [same thing]
-or-
> named :!official #()
> named( official => False ) #() [same thing]
Run Code Online (Sandbox Code Playgroud)
第一次遇到时,在这个例子中,raku 是相当古怪的。为什么?
:dothisbut:!notthat副词所以,恕我直言,raku 非常酷,因为我们只需要学习一些基本的元素语法(在本例中为 Pair 文字),然后可以以多种方式一致地应用它们,以简洁地解决相当棘手的编码场景。
通过椒盐卷饼逻辑,我得出的结论是:
或者(也许更有可能......):
无论哪种方式,请阅读这个答案并让我知道它是否有助于解决这个谜题。TIA。:)
我错过了一些东西,不是吗?但是什么?
也许这就是解决这个谜题的关键:我们应该问自己“基思在问题中故意遗漏了什么?”。
当然,如果是这样,你首先要忽略的就是它是一个谜语。在这种情况下,非常值得赞扬!如果这不是一个故意的谜语,那么,它仍然是一个谜语,所以无论如何,还是值得称赞的,让我们尝试解决它!
@codesection 的回答可能指出了最有力的线索。虽然您没有编写最小的可重现示例,但您确实编写了sub定义代码,并且您确实说过您编写了$private=False.
因此,我们假设您确实写了该sub定义,并且您确实写了$private=False.
此外,:
调用
$private=False“named”仍会打印“Official Business!” 而我认为不应该生成任何输出。
意味着在所有情况下都会生成一些输出。
无论如何,所有这些事情怎么可能同时成立呢?
这些是编译时错误:
sub named( :official( $private = True ) ) { "Official business!" if $private }
sub named( :official( $private = False ) ) { "Official business!" if $private }
Run Code Online (Sandbox Code Playgroud)
也是这样的:
$private = False;
Run Code Online (Sandbox Code Playgroud)
除非有事先的my $private...。
和这个:
sub named( :official( $private ) ) {
$private = True;
"Official business!" if $private
}
named;
Run Code Online (Sandbox Code Playgroud)
产生Cannot assign to a readonly variable or a value(当前在运行时),因为默认情况下,例程的参数是只读的。
您还说有输出(表面上是Official business!,但有时可能是其他东西,例如()?)。
您没有提到用于say显示输出的或类似的例程。怎么可能呢?我们来介绍一个say.
因此,将这些东西放在一起,并应用椒盐卷饼逻辑,我到达这里:
sub named(:official($private)) { "Official business!" if $private }
my $private;
$private = False;
say named :official; # Official business!
say named :!official; # ()
say named official => False; # ()
say named :official(False); # ()
say named; # ()
Run Code Online (Sandbox Code Playgroud)
将此解释为解决谜语:
()不是“无输出”。所以这与你的 Q 叙述并不矛盾。
我们已经写过了$private = False。由于词法作用域的原因,它对代码没有影响,但我们确实编写了它。:)
我温暖吗?