使用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,以防其他人也有帮助。也可以随意添加自己的答案。
答案 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 => 1
中A
是一个标识符。
为了展示相关概念,这里有一个虚构的讨论,包括一些问题和答案......
如果键是语法标识符,并且它直接在参数列表中,那么它将被视为命名参数。否则它将是一对
"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哈希并尝试解析它的数字
问:如果以后的东西只能是基本情况下的标识符,那么使用非标识符做事情就好了。
是的,任何非标识符都是特殊形式