2017-08-28 8 views
1

オブジェクトがあります。var Players:[ドメイン] Playerと逆の順序でオブジェクトを繰り返し処理したいと思います。チャペルでドメインによってインデックスされたオブジェクトを反復する方法

のようなものは、この

for p in Players by { 
    writeln(p.name); 
    writeln("I was the %i st player added".format(p.pid)") // pid corresponds to domain index. 
    p.shoeSize = 1.5*p.shoeSize 
} 

でも動作します!

// poops 
for p in Players by -1 { 
    writeln(p.name); 
    writeln("I was the %i -to-last player added".format(p.pid)") // pid corresponds to domain index. 
    p.shoeSize = 1.5*p.shoeSize 
} 

そして、私は靴のサイズが更新されていることを確認したいと思います。

== UPDATE ==あなたが期待したようにレンジ動作byは、アレイ上では動作しませんbencrayの要求

class Player { 
    var name: string, 
     position: string, 
     pid: int, 
     shoeSize: int; 
} 

var playerDom = {1..0}, 
    players: [playerDom] Player; 

writeln("I have %i players".format(playerDom.size)); 
// Now add some players 
// Better way to increase as I go along? 
playerDom = {1..playerDom.size+1}; 
players[playerDom.size] = new Player(name="Gretsky", position="Center", shoeSize=10, pid=playerDom.size); 
writeln("I have %i players".format(playerDom.size)); 

playerDom = {1..playerDom.size+1}; 
players[playerDom.size] = new Player(name="Blake", position="Defenseman", shoeSize=12, pid=playerDom.size); 
writeln("I have %i players".format(playerDom.size)); 

for p in players { 
    writeln("Player %i has shoeSize %i".format(p.pid, p.shoeSize)); 
    p.shoeSize += 1; 
} 

for p in players { 
    writeln("Player NOW %i has shoeSize %i".format(p.pid, p.shoeSize)); 
} 

// poops during compilation 
// domobj.chpl:31: error: the first argument of the 'by' operator is not a range 
for p in players by -1 { 
    writeln("Player NOW %i has shoeSize %i".format(p.pid, p.shoeSize)); 
} 
+0

マインドここでは、例えば、何が起こったのか、あなたは何を期待したのか?コンパイル時の失敗?実行時に障害が発生しましたか?予期しない動作? – bencray

+1

関連性がある場合は、 'Players'宣言と要素型宣言を提供できますか?関連性がない場合、この例を単純化して 'Players'を整数の配列にすると、各要素の値が更新されますか? – bencray

答えて

1

@称えるために

いくつかの追加情報/スペック。代わりに、私たちはここに示すように、逆にインデックスを反復処理のやや少ないエレガントな形で残されています。

以下
for i in players.domain by -1 { 
    writeln("Player NOW %i has shoeSize %i".format(players[i].pid, players[i].shoeSize)); 
} 

は、他のいくつかのクリーンアップを使用して、より大きなコードブロックである:より詳細な情報を提供する

var playerDom = {1..0}, 
    players: [playerDom] Player; 

writeln("I have %i players".format(playerDom.size)); 
players.push_back(new Player(name="Gretsky", position="Center", shoeSize=10, pid=players.size+1)); 
writeln("I have %i players".format(playerDom.size)); 
players.push_back(new Player(name="Blake", position="Defenseman", shoeSize=12, pid=players.size+1)); 
writeln("I have %i players".format(playerDom.size)); 

for p in players { 
    writeln("Player %i has shoeSize %i".format(p.pid, p.shoeSize)); 
    p.shoeSize += 1; 
} 

for p in players { 
    writeln("Player NOW %i has shoeSize %i".format(p.pid, p.shoeSize)); 
} 

for i in players.domain by -1 { 
    ref p = players[i]; 
    writeln("Player NOW %i has shoeSize %i".format(p.pid, p.shoeSize)); 
} 

class Player { 
    var name: string, 
     position: string, 
     pid: int, 
     shoeSize: int; 
} 
+0

補足として、 '-1で配列の要素{...}' *がチャペルで動作すべきかどうかと思います。これは機能要求として検討する価値があります。 – bencray