对象签名的文档:“...命名参数的名称与变量名称不同”

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!” 而我认为不应该生成任何输出。我错过了一些东西,不是吗?但是什么?

cod*_*ons 7

我看到文档示例是多么令人困惑。这是该解释的扩展版本:

\n
sub 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\n
Run 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
\n

如果我理解正确的话,你的意思是写类似的东西

\n
sub named(:official($private)=True) { "Official business!" if $private }\n
Run Code Online (Sandbox Code Playgroud)\n

这是你的意思吗?如果是这样,您应该知道$private=True在该签名中并没有真正设置 $private任何内容 \xe2\x80\x93 它只是为变量提供默认值$private。所以你可以得到这个输出:

\n
sub named(:official($private)=True) { "Official business!" if $private }\n
Run Code Online (Sandbox Code Playgroud)\n

无论如何,我都会向文档存储库发送 PR,并尝试稍微澄清一下命名参数示例。希望您喜欢 Raku!

\n

  • 谜中之谜。:) ❶ 我认为它*会*编译。❷可能会解释基思正在尝试/看到的内容。❸ 但是当我尝试的时候,编译时失败了。(前后都有`)`。)我什至在我的回答中包含了这个“事实”。❹我发表了我的答案。❺我对你的回答写了我的第一条评论。❻你告诉我它*确实*有效!❼ 哈?!?快速仔细检查。啊!我搞砸了!❽我编辑了我的答案以删除我的虚假“事实”。❾(这一切都发生在不到 5 分钟的时间内,所以我的答案版本中没有任何记录。)❿ 我不明白它是如何解决 Keith 的问题/谜语的...... (2认同)
  • “它需要知道的只是参数的名称 – :public”。您的意思是“:official”而不是“:public”? (2认同)

p6s*_*eve 7

在这个简短的例子中发生了一些事情:

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 是相当古怪的。为什么?

  • raku Pair 文字语法可以轻松处理常见的函数参数情况,例如:dothisbut:!notthat副词
  • :name(value) 公式在这里被重新使用来将外部变量名称映射到内部变量名称 - 没有什么特别需要的,因为 Pair 语法已经做到了这一点 - 但对于代码封装非常有用
  • 参数别名的情况类似...您可以将其视为成对的...再次,不需要特殊的语法,因为仅使用内置的 Pair 文字语法

所以,恕我直言,raku 非常酷,因为我们只需要学习一些基本的元素语法(在本例中为 Pair 文字),然后可以以多种方式一致地应用它们,以简洁地解决相当棘手的编码场景。


rai*_*iph 5

通过椒盐卷饼逻辑,我得出的结论是:

  • 你可能精心写下你的问题来欺骗我们,如果我们正确解开谜题,你就会揭露真相。

或者(也许更有可能......):

  • 采用这种心态将帮助我们所有人——你、读者、回答者——在我们尝试解决你真诚的问题中固有的谜语时享受乐趣,即使你打算让这个有趣......

无论哪种方式,请阅读这个答案并让我知道它是否有助于解决这个谜题。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。由于词法作用域的原因,它对代码没有影响,但我们确实编写了它。:)


我温暖吗?