当前位置: 首页 > 知识库问答 >
问题:

在Perl 6中的方法和函数调用中使用冒号

宰父保臣
2023-03-14

我想知道冒号与Perl 6中的方法和函数调用有什么关系。郑重声明,我使用的是基于MoarVM版本2015.05html" target="_blank">构建的perl6版本2015.05-55-gd84bbbc。

我刚刚在Perl6规范测试(S32-io)中看到了以下内容(我添加了评论):

$fh.print: "0123456789A";   # prints '0123456789A' to the file

据我所知,这相当于:

$fh.print("0123456789A");   # prints '0123456789A' to the file

这两者似乎都需要多个论点并很好地扁平化列表:

$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

这两种不同的语法肯定是有原因的。是否有任何理由使用一种或另一种语法?

我还注意到,当用作方法时,我们必须在打印时使用()

$fh.print(@a);   # Works
$fh.print: @a;   # Works!
$fh.print @a;    # ERROR!

使用带有函数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) 

然后我尝试在脚本文件中使用print。这适用于打印到标准输出:

print @a;

但是,这不会打印到标准输出:

print: @a, @a;

但方法版本运行良好:

$fh.print: @a, @a; # Prints '0123456789A0123456789A' to the file

我觉得我差不多明白了,但我无法用语言表达。有人能解释一下这些使用打印的品种吗?还有,这些行为会因为大列表重构而改变吗?

共有2个答案

蒋哲
2023-03-14

只是想进一步澄清一下,使用冒号代替括号是一种调用语法的替代方法,而不是替代函数调用语法。当将函数或块作为参数传递给方法时,它非常方便。使用grep或map是常见的例子-请考虑;

@measurements.map( { check_accuracy($_); fail "bad value" if $_ < 0 }  );

请注意,我在结束卷曲之后放了一个额外的空间,以尝试将我传递的函数与关闭方法调用所需的必要语法分开。这段代码的读者完全理解整个块是调用的一个参数,并且通常专注于块的内容将实现什么——然后遇到我所说的“独行侠”——就像独行侠总是和他信任的骏马Silver在一起一样,独行侠几乎总是在他信任的骏马分号旁边。

为什么不把它们都扔掉呢?

如果语句以结尾卷曲结束,则可选方法调用语法与分号相结合,使之成为可能;

@measurements.map:  { check_accuracy($_);  fail "bad value" if $_ < 0 }

好多了
虽然替代方法调用格式是另一种需要学习的语法,但它很容易理解,并且在某些情况下,如上文所述,可以使生成的代码更清晰、更易于阅读。

端木安国
2023-03-14

使用冒号而不是括号的主要原因之一是它可以通过删除一组括号来帮助整理代码。否则它们完全相同。

当您打印:@a时,您真正要做的是在行上贴上标签,然后让a穿过。在REPL中,它将使用值调用say。

如果您在方法调用中不使用括号或冒号,那么该方法将在没有参数的情况下被调用。

如果使用冒号,则可以交换方法的顺序和发票。

say $*ERR: 'hello world'; # $*ERR.say('hello world')
 类似资料:
  • 本文向大家介绍Lua中调用函数使用点号和冒号的区别,包括了Lua中调用函数使用点号和冒号的区别的使用技巧和注意事项,需要的朋友参考一下 本文是面向对象预热篇,讲解函数两种调用方式的区别,初学者比较容易被坑。 1.初学者最易混乱Top1——调用函数时用点号还是用冒号? 我们来看看下面的两句代码: 对于初次接触Lua的朋友来说,这简直就是噩梦,为嘛函数的调用有两种形式,是让我们随便挑的意思吗?   这

  • 我有一个类分别组成两个方法静态和非静态,根据我有限的知识提交方法接受可运行的,可调用的实例直接或通过lamba表达式。 今天我知道了,我们甚至可以直接使用双冒号调用或触发静态和非静态方法,这是在Java8中添加的。 我只是想知道这是如何工作的,我的类中没有run方法,它也没有实现runnable,甚至我也没有使用Lamba? 使用::是一个好的实践吗?还是应该传递runnable或callable

  • 问题内容: 我正在寻找从Java程序中执行Haskell函数的有效方法。我已经考虑过使用exec()与GHC进行交互,但是似乎应该有一个更好的方法。 问题答案: 我通常避免使用JNI类型的方法来跨运行时/语言进行链接。他们只是有太多的陷阱而没有什么好处。我发现跨流程边界工作更容易。尽管我从未在Haskell和Java上尝试过,但它们都具有支持XML RPC的库,听起来很自然地适合您的工作。因此:将

  • 本文向大家介绍JavaScript中5种调用函数的方法,包括了JavaScript中5种调用函数的方法的使用技巧和注意事项,需要的朋友参考一下 这篇文章详细的介绍了Javascript中各种函数调用的方法及其原理,对于理解JavaScript的函数有很大的帮助! JavaScript,调用函数的5种方法 一次又一次的,我发现,那些有bug的Javascript代码是由于没有真正理解Javascri

  • 本文向大家介绍Lua中使用.和:调用函数的区别,包括了Lua中使用.和:调用函数的区别的使用技巧和注意事项,需要的朋友参考一下 tb.print和tb:print的含义略微不同,:调用函数会多传递进去一个self进去,差不多相当于OOP里面的成员函数调用. 但是和OOP里面成员函数/非成员函数不同的是,lua里面的非成员函数.调用,他不是静态的. tb对象有一个print function成员,当

  • 本文向大家介绍javascript中函数作为参数调用的方法,包括了javascript中函数作为参数调用的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript中函数作为参数调用的方法。分享给大家供大家参考。具体分析如下: 先来看示例: 这段代码执行的顺序是:从上往下顺序解释执行,这是JS的规定。 这里主要说明一下m.eachMap()中函数做为参数是怎么传递并执行的: