2017-08-21 10 views
6

、私はこのような多くの方法を見てきました:私はList:Dをkonw"List:D:"の2番目のコロンはPerl 6の意味ですか? <a href="https://docs.perl6.org/routine/sum" rel="nofollow noreferrer">doc.perl6.org</a>で

method sum(List:D: --> Numeric:D) 

が定義されているリストの種類ですが、D後のコロンは何を意味している(すなわちList:D:第二1 )?

私はいくつかのS12-objectsに説明した:インボカントの

= HEAD2 Invocants

宣言はオプションです。キーワードselfを使用して、常に現在のinvocantにアクセスすることができます。 ... はちょうどそれの後にコロンを入れて、明示的なインボカントをマークするには、次の

method doit ($x: $a, $b, $c) { ... } 

が、私はそれは一見するとやや奇妙だ、理解していません。デフォルトの方法により

+1

関連項目GitHub Perl6 doc issue [1121](https://github.com/perl6/doc/issues/1121):ドキュメントメソッドinvocant。 –

答えて

6

は、したがって、これらの両方が同等になるself

のインボカントを持っている:だからそれは

のためにソートが不足しているものに外に最初の例を拡大し

method foo (  $a){…} 
method foo (\self: $a){…} # generates warning 

method sum(List:D \self: --> Numeric:D){…} # generates warning 

基本的に、あなたはinvocantのタイプ(最初のargumen t)をメソッドに追加しますが、新しい変数を指定するのではなく、selfを使用します。それは残りのパラメータからインボカントを分割する:を使用しています


の理由は、あなたがインボカント、あるいはインボカントのタイプを指定しない一般的なケースを簡素化することです。

1

あなたはこのような基本的な型の制約とサブを定義します。

sub testB (Str $b) { say $b; } 

、あなたが質問にだけでなく、型オブジェクト自体に種類の実際のインスタンスでそれを呼び出すことができます。

> testB("woo") 
woo 
> testB(Str) 
(Str) 

:あなただけの "定義された" インスタンスを渡すことができますので、Dは、追加の型制約です:

sub testC (Str:D $c) { say $c; } 
> testB(Str) 
(Str) 
> testC("hoo") 
hoo 
> testC(Str) 
Parameter '$c' of routine 'testC' must be an object instance of type 'Str', not a type object of type 'Str'. Did you forget a '.new'? 
    in sub testC at <unknown file> line 1 
    in block <unit> at <unknown file> line 1 

さらに詳しい情報が見つかりましたhere

+1

私はchenyfが最初のコロンではなく型定義の第2コロンについて尋ねていたと思います。 'Str:D'ではなく' Str:D: 'です。 – piojo

+0

これも私の最初の考えでした。私はそれをもっと明確にするために質問を更新しました。 –

+0

ありがとうChristopher Bottoms – chenyf

関連する問題

 関連する問題