A =>之间有什么区别? 1和' A' => 1?

时间:2017-08-08 18:44:39

标签: perl6

使用Perl 6 REPL:

> Map.new: 'A' => 1, 'B' => 2;
Map.new((:A(1),:B(2)))
> Map.new: A => 1, B =>2;
Map.new(())

我以前认为A => 1'A' => 1是相同的,因为=>应该将该字自动引用到左侧,但在第二个示例中,这些对似乎消失了。

免责声明:今天早些时候我绊倒了,所以我将其发布为Q& A,以防其他人也有帮助。也可以随意添加自己的答案。

2 个答案:

答案 0 :(得分:4)

通常,A => 1'A' => 1创建等效的Pair对象。但是在子例程或方法调用中,第一种语法被解析为命名参数而不是一对。并且 在方法中,忽略未使用的命名参数 ,这解释了在第二个语句中创建的空Map。因此,您必须特别注意解析器不会将您的对解释为命名参数。以下都与命名参数区别开来:

Map.new: (A=>1, B=>2);    # extra set of parentheses 
Map.new: 'A'=>1, 'B'=>2;  # quote the keys
Map.new: 'A', 1, 'B', 2;  # Don't use fat commas `=>`

顺便说一下,这也证明了使用冒号:代替()进行方法调用的另一个原因。使用括号可能不那么干净:

Map.new( A=>1, B=>2);  # oops, named arguments
Map.new((A=>1, B=>2)); # extra set of parentheses solves the issue 

答案 1 :(得分:1)

'A' => 1中,'A'是一个字符串,在A => 1A是一个标识符。

为了展示相关概念,这里有一个虚构的讨论,包括一些问题和答案......

如果键是语法标识符,并且它直接在参数列表中,那么它将被视为命名参数。否则它将是一对

"foo" => "bar"不是语法标识符,(foo => "bar")不是直接在参数列表中,也不是(:foo<bar>)

foo => "bar":foo("bar")是等效的,并且都有一个作为语法标识符的键

问题::ident<foo>是否在参数列表之外向"ident"=>"foo"推广?

这是错误的方式。他们总是一对;但是,当它们位于参数列表的顶层时,它们会被提升为命名参数

问题:为方便起见,:2<>:2nd不会变成对吗?

:2<>是语法错误。

:2nd只是:nd(2)

问:为什么不“第二”=&gt; “真正”?因为不是标识符?

另外因为它不是很有用 想象一下尝试实现s:2nd / foo / bar / 将不得不采取一个slurpy哈希并尝试解析它的数字

问:如果以后的东西只能是基本情况下的标识符,那么使用非标识符做事情就好了。

是的,任何非标识符都是特殊形式