2017-11-28 6 views
7

に属する変数を宣言すると、私は単にはPerl 6でユーザー定義クラスに

my Int $a; 

を書くしかし、私は使用したいときユーザー定義のクラスI have to useClassname.new

my class House { 
    has $.area is rw; 
} 

my $house1 = House.new; 
$house1.area = 200; 
say $house1.area; 

私の純粋な質問は、その違いの理由は何ですか?なぜ単にmy House $house1と書くことができないのですか?

私の究極の目標は、値がユーザー定義クラスのインスタンスである配列を使用することです。どうすれば正しく以下を行うことができますか?

my @houses ...; 
@houses[10].area = 222; 
+2

'House'リテラルを作成する構文はありません。' Int'リテラル '200'を作成する構文があります。 –

答えて

12

my House $aは、my Int $aと同じです。それはあなたがそれに置くことができる値に制限を置く。変数の内容を見ると、その制限の型オブジェクトが得られます。 my House $a .= new、​​の等価です:そこ

あなたがHouseビットを繰り返す必要はありませんので、あなたが、しかし使用することができますトリックです。未定義の型オブジェクトを取って1、およびその他のオブジェクトのインスタンス:

class House { 
    has $.area; 
    multi method area(House:U \SELF:) is raw { 
     (SELF = House.new).area 
    } 
    multi method area(House:D:) is raw { 
     $!area 
    } 
} 
my House @houses; 
@houses[2].area = 42; 
say @houses # [(House) (House) House.new(area => 42)] 

私たちは、アクセサメソッドのための2つの候補を作成する:はい、あなたはいくつかの問題でそれを行うことができます:バックあなたの質問に取得するには

。最初の呼び出し元は、呼び出し元を変更し(設定可能なコンテナであると仮定して)、メソッドのインスタンス化されたバージョンを呼び出します。これを読者に練習として残して、これをAttribute形質に変えています。

2

あなたがmy Int $a;を書くとき、あなたがタイプIntの変数を持っていますが、値、あるいはコンテナなしになります。 $aの具体的な値は(Int)になります。

my House $house;と同じです - あなたは(House)値を取得します。

あなたの場合、配列の要素をいくつかのハウス値で初期化する必要があります。たとえば、

my @houses = House.new() xx 11; 
@houses[10].area = 222; 
+0

ありがとう!しかし、私は 'my $ a = Int.new'を書く必要はありません。質問は - なぜですか? –

+1

あなたはそれを書くことができます。オブジェクトのいくつかのクラスのインスタンスを作成するためのいくつかの簡略化された方法があります。あなたが望むなら、自分のオブジェクトのための独自の簡略メソッドを作成することができます。つまり、 '' $ a = '' 'と書くことができます。 –

+2

コードでは、' $ a = 222'定数 '222'は' Int'値として解釈できる値です。一方、コード 'my house $ h = House.new(); my $ n = $ h; '変数' $ h'は 'House'型の値を記述し、その値を' $ n'に入れて 'House 'を書く必要はありません。変数 '$ n'に対してnew()を呼び出します。私は '222'と' House.new'は同じことを意味します。 –

2

私はあなたがコンパイラがあなたのためにいくつかの仕事をしている部分を見逃していると思います。リテラル番号を持つと、パーサーはそれを認識し、その数値オブジェクトを構成します。既にrakudo/src/Perl6/Actions.nqpにあなたのために起こっているバーチャルで見えないInt.new()があります。それはNQPレベルですが、それは同じ考えです。

関連する問題