Perl6-クラス

1. Perl6で変数とリテラルを操作する機能

2. Perl6-変数の操作、匿名ブロック

3. Perl6-条件付きステートメント、ループ

4. Perl6-関数を使用する



過去数日間、Perl6でオブジェクトを操作するセクションを読んでいます。 残念ながら、私はいくつかのポイントを理解できませんでした、そして、すでにそれらを理解することができた人々が問題が何であるかをあなたに話すことを望みます。 前述のように、説明されているすべての機能には、その機能や使用方法を説明するための小さな実験または例が付属しています。

続行:





Perl6では、クラスを宣言する2つの方法があります。

-ファイル全体をクラスの説明にする

class Name; has $.field; ... method Func() {...};
      
      





-コンストラクトを使用してクラスを宣言する

 class Name { has $.field; }
      
      





C ++の場合と同様に、クラスの名前のみを指定して、後でその説明を指定できます。

 class Name {...}; my $var = Name.new; class Name {has $.elem};
      
      





最後の行が存在しない場合、コンパイルエラーが発生します。

次のことも可能です。

 my $className = class Name { has $.field is rw; } my $var1 = Name.new; my $var2 = $className.new; $var1.field = 10; $var2.field = 5; say $var1.field, ' ', $var2.field;
      
      





その結果、行'10 5 'が表示されます。

コンストラクトを使用して匿名クラスを作成できます

 my $anonClass = class :: {has $.field}; my $var = $anonClass.new;
      
      





既に作成された変数を使用して、新しい変数を作成できます。

 my $var1 = ClassName.new; my $var2 = $var1.new;
      
      





ただし、作成はデータをコピーせずに行われます。



宣言時に指定できるものの詳細:

hasキーワードは、フィールドを示すために使用されます。

 class Name { has Int $.publicMember; has $!privateMember; has @.publicArray is rw; has %!privateHash; has $.a is rw; has $.b is rw = '  '; } my $v = Name.new; say $v.publicMember; # "Int()" #$v.publicMember = 10 - ,  readonly #say $v!privateMember -  $v.mas = 1, 2, 3; #say $v!privateHash -  $va = 'new value'; say $vb # "  "
      
      





また、メソッドの本体では、読み取り専用であってもプライベート変数を変更できることに注意してください(ただし、これが意図された方法である、または仮想マシンの不完全性が影響を及ぼすとは言えません)



クラスメソッドは、methodキーワードで示されます。

 class Name { has $!privateMember = 5; method GetPrivateMember() { return $!privateMember; } method SetPrivateMember($value) { $!privateMember = $value if $value > 0; } } my $var = Name.new; say $var.GetPrivateMember; $var.SetPrivateMember(10); $var.SetPrivateMember: 20;
      
      







メソッドはプライベートとして宣言できます:

 method !PrivateMethod() { say 'Hello!'; }
      
      





メソッドが呼び出されるオブジェクト(インボカント)を使用できる変数を指定できます。

 method Func($self: $param1, $param2) { $self.Func2($param1); }
      
      





変数名は$ selfである必要はありません

 method Func($someName: $param1, $param2) { $someName!PrivateMethod($param1); }
      
      





この変数が指定されていない場合、オブジェクト自体は「self」として利用可能になります

 method Func($param1, $param2) { self.PublicMethod($param1); self!PrivateMethod($param2); }
      
      







メソッド本体でこのクラスの別のメソッドを呼び出すには、次の構成を使用します

 self!PrivateMethod(); self.PublicMethod();
      
      





例えば

 class Name { method !A() { say "!A"; } method A($s:) { $s!A(); } method B() { self!A; self.C; say "B"; } method C() { say "C"; } }
      
      





self.Aとselfを呼び出すこともできます!A



メソッド本体のクラスのフィールドにアクセスするには、宣言と同じ名前が使用されます。

 class Name { has $.a; has $!b; method PrintValues() { say $.a; say $!b; } }
      
      





self.aも記述できますが、selfは記述できません!B、 この場合、変数bにアクセスするのではなく、プライベートメソッドbを呼び出すことを意味します



宣言時にクラス名がrwの場合、このクラスに含まれるすべてのフィールドは、各フィールドごとにrwを指定せずに書き込み可能になります。

 class Name is rw { has $.a; has $.b; }
      
      







クラスでサブメソッドを宣言することもできます。 通常のメソッドとの違いは、サブメソッドが子クラスに継承されないことです。



デザイナーについて

クラスの新しいインスタンスを作成するときに実行するアクションを指定できます。

 class Name { has $.arg1 is rw = 10; has $!arg2; submethod BUILD(:$namedArg1, :$namedArg2) { self.arg1 = $namedArg1 if $namedArg1>0; $!arg2 = $namedArg2; } } my $var = Name.new(:namedArg2(200), :namedArg1<Hello>);
      
      





理解できないことが1つあります。$ .arg1ではなくself.arg1を記述しなければなりませんでした。 「部分的に構築されたオブジェクトでは仮想呼び出し$ .aを使用できない」というエラーが表示されました。

それが計画されているのか、それともまだ完全に解決されていない部分なのかがわかりません。 しかし、いずれにしても、そのようなコンストラクターは正常に機能します。



GarbageCollectorによって自動的に呼び出されるデストラクタを指定することもできます。

 submethod DESTROY() { say 'DESTROY'; }
      
      





しかし今回は、実験中に上記の碑文を見ることができませんでした。 この部分もまだ完成していないと思います。



Perl6では、継承は次の構成によって編成されます。

 class Name {has $.a}; class Name2 is Name {has $.b}; my $var = Name2.new; say $var; #Name2.new(b => Any, a => Any)
      
      







多重継承が可能であり、その結果、クラス内の関数またはフィールドの名前が一致することが判明する場合があります。

 class Name { has $.a is rw = 10; has $.c is rw = 15; method A() {say "Name ", $.a;} } class Name2 { has $.b is rw = 20; has $.c is rw = 25; method A() {say "Name2 ", $.b;} } class Name3 is Name is Name2 { method A() { self.Name2::A(); say $.c; } } my $var = Name3.new; $var.a = 100; $var.b = 200; $var.A;
      
      





この場合、画面には次の2行が表示されます。

 Name2 200 15
      
      





子クラスで関数Aを再定義しない場合、Name :: A関数はName2 :: A関数をオーバーライドします。これは$ .c変数でも発生します

私が理解しているように、行self.Name2 :: A(); Name2 :: A()メソッドはselfオブジェクトに対して実行されますが、self.Name2という名前でエラーが生成され、self。(&Name2 :: A)または何かを書くことができないという事実によって、その動作についての私の推測はすべて損なわれます。そのような。 知識のある人が教えてくれたら嬉しいです。



もちろん、ここで説明する機能はオブジェクトでできることの一部に過ぎません(たとえば、委任については言及しませんでした。役割はC ++のインターフェイスの類似物です)が、現時点ではこのトピックを深く掘り下げたくはありませんが、勉強を続けますPerl6の他の機能。 それまでの間、言語の習得を開始するには、説明されている言語で十分です。



All Articles