2017-05-21 17 views
7

これは予期しない動作で、初心者にはうんざりです。まず、これは意図されていますか?第2に、Perl 6がどのオブジェクトを作成するかを推測するのに他にどのようなことがありますか?ブロックやハッシュと思って後で変更するのか、それとも終わりを決めるのでしょうか?それはPerl 6のハッシュまたはブロックですか?

あなたは括弧付きHashと脂肪の矢印を構築することができます。他のペアの表記を使用して

my $color-name-to-rgb = { 
    'red' => 'FF0000', 
    }; 

put $color-name-to-rgb.^name; # Hash 

があまりにもHash作成します。

my $color-name-to-rgb = { 
    :red('FF0000'), 
    }; 

しかし、脂肪の矢印がない限り、私は代わりにBlockを得る:

my $color-name-to-rgb = { 
    'red', 'FF0000', 
    }; 

put $color-name-to-rgb.^name; # Block 

Hashドキュメントは括弧内$_を使用してBlockを作成することを言及。

ハッシュを定義する他の方法もありますが、この特定の構文について質問していますが、私がすでに知っている回避策を探していません。

$ perl6 -v 
This is Rakudo version 2017.04.3 built on MoarVM version 2017.04-53-g66c6dda 
implementing Perl 6.c. 

答えて

8

概要

のフォーム{ ... } "ブロック"(小文字)のリテラルプログラムテキストを呼ぶことにしましょう。

ブロックterm位置である:

ルール#1。 ブロックでなければならない?signatureのブロックは、呼び出し可能なコードでなければなりません。それはstatements別名Blockのリストとして解釈されます。

ルール#2。 ハッシュのように見えますか?それ以外の場合、ブロックが構文的にAssociativeの値で始まる場合、それはリテラルHashコンストラクタとして解釈されます。

ルール#3。 それ以外の場合は、Blockと解釈されます。

より詳細には

ブロックは署名を有している場合、ブロックは、ブロックでなければなりません。

ブロックの中には、明示的なという署名があります。これらはBlockでなければなりません:

say WHAT -> $foo { key => $foo, 'a', 'b' } # (Block) 

いくつかのブロックが暗黙の署名を持っています。プレースホルダ変数(例えば、$^foo)を使用すると、すぐに囲むブロックに暗黙的な署名(その中に$fooパラメータを持つ)が与えられます。代名詞($_@_、または%_)を使用すると、すぐに囲まれているブロックに、明示的な署名がまだない場合は暗黙的な署名が与えられます。

# Both these blocks have a signature, the first one implicitly so: 
say WHAT   { key => $_, 'a', 'b' } # These two lines mean 
say WHAT -> $_ { key => $_, 'a', 'b' } # the same thing 

ブロックのコンテンツの構文Associativeだ値で始まる場合そうでない場合、そのブロックはHashとして解釈されるであろう。 Blockまたはvice-にHashからの切り替え

say WHAT { key => $foo,   'a', 'b'  } # (Hash) 
say WHAT { 'a', 'b',    key => $foo } # (Block) 

say WHAT { %foo,     'a', 'b'  } # (Hash) 
say WHAT { Pair.new('key',$foo), 'a', 'b'  } # (Block) 

:私は連想リテラル値(例えば:fooまたはfoo => Trueなど)または% sigil'd変数のいずれかを意味する「構文的Associativeだ値」とは、

あなたがBlockを望んでいたが、Hashを得た場合はその逆

、慣用的な変更は{; ...}すなわち、ブロックの開始時に;を追加しています。

Hashが届いてもBlockが表示されている場合は、上記のルールに従うか、@Samantha M.の回答ごとに%()を使用してください。

脚注

多くの構築物は常に、いくつかの位置に例えばclass foo { ... }をリテラルブロックを必要としています。これらのブロックは常にBlockと解釈されます。たとえば%foo{...}に示すようにpostcircumfix operatorと表示されるブロックは、Associativeのインデックス作成操作として解釈されます。

7

好ましいPerl6方法は、%()を使用してハッシュを作成することです。

my $color-name-to-rgb = %(
    'red', 'FF0000', 
    ); 

ハッシュを作成するために中カッコを使用することはお勧めできません。彼らがハッシュを作成したい場合は%()が適切な方法です。

あなたがPerl 5の世界から来ている場合は、ハッシュを作成するときにの代わりに%()を使用するという習慣に入るのが一番です。

+2

エラーをスローし、 '%()'を使用するように指示するために '{}'を使ってハッシュを作成することを思い出しています。私の意見では、この振る舞いは戻るはずです。 – ab5tract

+4

これを反映させるには、ドキュメントに大きな更新が必要です。 '%()'は、 '{}'が機能しないときの代替手段として言及されています。ドキュメントでない場合は、何をするのが好ましい方法のソースですか? –

+0

私はあなたの評価Brianに完全に同意します。私はここでドキュメントの問題を開いたhttps://github.com/perl6/doc/issues/1380 以前は、プログラムの完了後に表示される廃止予定の警告がありました。あなたは '{}'でハッシュを作成します。 –

関連する問題