使用Perl 6 REPL:
> Map.new: 'A' => 1, 'B' => 2;
Map.new((:A(1),:B(2)))
> Map.new: A => 1, B =>2;
Map.new(())
Run Code Online (Sandbox Code Playgroud)
我以前认为A => 1
并且'A' => 1
会相同,因为=>
它应该自动将该单词自动引到左侧,但在第二个示例中,这些对似乎消失了.
免责声明:今天早些时候我绊倒了,所以我把它作为Q&A发布,以防它对其他人也有帮助.也可以随意添加自己的答案.
一般来说,A => 1
并'A' => 1
创建等效的 Pair 对象。但在子例程或方法调用内部,第一个语法被解析为命名参数而不是 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 `=>`
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这也说明了使用冒号:
而不是()
方法调用的另一个原因。使用括号可能不太干净:
Map.new( A=>1, B=>2); # oops, named arguments
Map.new((A=>1, B=>2)); # extra set of parentheses solves the issue
Run Code Online (Sandbox Code Playgroud)