6

Perl 6 のメソッドと関数の呼び出しでコロンが何をしなければならないのか疑問に思っています。記録として、MoarVM バージョン 2015.05 上に構築された 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

これら 2 つの異なる構文を使用するには、何らかの理由があるはずです。いずれかの構文を使用する理由はありますか?

:また、メソッドとして使用する場合は、または()printを使用する必要があることにも気付きました。

$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

なんとなくわかった気がするのですが、言葉にできません。誰かが印刷物を使用してこれらの種類を説明してもらえますか. また、これらの動作は Great List Refactor によって変更されますか?

4

2 に答える 2

9

もう少し明確にするために-括弧の代わりにコロンを使用することは、代替関数呼び出し構文ではなく、代替メソッド呼び出し構文です。関数やブロックを引数としてメソッドに渡すときに非常に便利です。grep または map の使用は一般的な例です。

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

メソッド呼び出しを終了するために必要な構文から、渡す関数を分離するために、終了中のカーリーの後に余分なスペースを入れたことに注意してください。このコードの読者は、ブロック全体が呼び出しの引数であることを完全に理解しており、通常、ブロックの内容が達成しようとしていることに焦点を当てています - そして、私が「ローン・パレン」と呼んでいるものに出くわします - そしてローン・レンジャーのようにローン・パレンは、信頼できる馬であるシルバーと常に一緒に見られ、ほとんどの場合、彼の信頼できる馬であるセミコロンの隣にいます。

両方をジャンクにしてみませんか?

ステートメントが終了カーリーで終了する場合にオプションであるセミコロンと組み合わせた代替メソッド呼び出し構文は、それを可能にします。

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

ずっといい。
代替メソッド呼び出し形式は、習得が必要なもう 1 つの構文ですが、簡単に理解でき、状況によっては、上記のように、結果のコードがよりクリーンで読みやすくなります。

于 2016-02-13T10:57:05.420 に答える
9

括弧の代わりにコロンを使用する主な理由の 1 つは、括弧のセットを 1 つ削除することで、コードを整理するのに役立つからです。それ以外はまったく同じです。

あなたが持っているときprint: @a、あなたが実際にしているのは、ラインにラベルを付けて、@aフォールスルーさせることです. REPLsayで値を呼び出します。

メソッド呼び出しで括弧またはコロンを使用しない場合、メソッドは引数なしで呼び出されます。


メソッドの順序と、コロンを使用する場合は呼び出し元を入れ替えることができます。

say $*ERR: 'hello world'; # $*ERR.say('hello world')
于 2015-06-22T19:31:05.680 に答える