我想知道冒号与Perl 6中的方法和函数调用有什么关系.对于记录,我使用的是基于MoarVM版本2015.05构建的perl6版本2015.05-55-gd84bbbc.
我刚刚在Perl6规范测试中看到了以下内容(S32-io)(我添加了评论):
$fh.print: "0123456789A"; # prints '0123456789A' to the file
Run Code Online (Sandbox Code Playgroud)
据我所知,这相当于:
$fh.print("0123456789A"); # prints '0123456789A' to the file
Run Code Online (Sandbox Code Playgroud)
这两个似乎都采取了多个参数并平整列表:
$fh.print: "012", "345", "6789A"; # prints '0123456789A' to the file
$fh.print("012", "345", "6789A"); # prints '0123456789A' to the file
my @a = <012 345 6789A>;
$fh.print(@a); # prints '0123456789A' to the file
$fh.print: @a; # prints '0123456789A' to the file
Run Code Online (Sandbox Code Playgroud)
必须有一些理由拥有这两种不同的语法.有没有理由使用一种或另一种语法?
我还注意到,当用作方法时,我们必须使用:或()使用print:
$fh.print(@a); # Works
$fh.print: @a; # Works!
$fh.print @a; # ERROR!
Run Code Online (Sandbox Code Playgroud)
使用具有该功能的冒号时也存在一些有趣的行为print.在这种情况下,:和()不等价的:
print @a; # Prints '0123456789A' (no newline, just like Perl 5)
print(@a); # Ditto
print: @a; # Prints '012 345 6789A' followed by a newline (at least in REPL)
print @a, @a; # Error (Two terms in a row)
print: @a, @a; # Prints '012 345 6789A 012 345 6789A' followed by a newline (in REPL)
Run Code Online (Sandbox Code Playgroud)
然后我尝试在脚本文件中使用print.这适用于打印到标准输出:
print @a;
Run Code Online (Sandbox Code Playgroud)
但是,这不会打印到标准输出:
print: @a, @a;
Run Code Online (Sandbox Code Playgroud)
但方法版本工作正常:
$fh.print: @a, @a; # Prints '0123456789A0123456789A' to the file
Run Code Online (Sandbox Code Playgroud)
我觉得我几乎理解这一点,但我无法用语言表达.有人可以解释这些使用印刷品的种类.此外,由于Great List Refactor,这些行为会发生变化吗?
使用冒号而不是parens的主要原因之一是它可以通过删除一组parens帮助整理代码.否则它们完全一样.
当你拥有时print: @a,你真正在做的是在线上贴上标签,然后让它掉头@a.REPL中的哪个将调用say该值.
如果在方法调用中不使用parens或冒号,那么将调用该方法而不使用参数.
您可以交换方法的顺序,如果使用冒号,则可以调用invocant.
say $*ERR: 'hello world'; # $*ERR.say('hello world')
Run Code Online (Sandbox Code Playgroud)
只是为了进一步澄清 - 使用冒号而不是括号是调用语法的替代方法,而不是调用语法的替代函数.将函数或块作为参数传递给方法时非常方便.使用grep或map是常见的例子 - 考虑;
@measurements.map( { check_accuracy($_); fail "bad value" if $_ < 0 } );
Run Code Online (Sandbox Code Playgroud)
注意我在结束卷曲之后放了一个额外的空格来尝试分离我正在从关闭方法调用所需的必要语法传递的函数.这段代码的读者完全理解整个块是调用的一个参数,并且通常关注块的内容将要实现的内容 - 然后遇到我称之为"孤独的Paren" - 并且像Lone Ranger一样总是看到他那可靠的骏马,银色,孤独的帕伦几乎总是紧挨着他可信赖的骏马,分号.
为什么不把它们两者都垃圾呢?
替代方法调用语法结合分号是可选的,如果一个语句以一个结束卷曲结束,使这成为可能;
@measurements.map: { check_accuracy($_); fail "bad value" if $_ < 0 }
Run Code Online (Sandbox Code Playgroud)
好多了.
虽然替代方法调用格式是另一种要学习的语法,但它很容易理解,并且在某些情况下,如上所述,使得结果代码更清晰,更易于阅读.
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |