2017-09-08 10 views
3

可変整数を増やすのに問題があります。意図した出力があった整数の増分

myInteger: 0 
{ 0, 0, 0, 0 } 

:このコード:

variable Integer myInteger = -1; 
Integer getInteger() { 
    myInteger = myInteger + 1; 
    print("myInteger: " + myInteger.string); 
    return Integer(myInteger); 
} 

Array<Integer> integers = 
     Array.ofSize(
      4, 
      getInteger()); 

print(integers); 

は、この出力を提供します

myInteger: 0 
myInteger: 1 
myInteger: 2 
myInteger: 3 
{ 0, 1, 2, 3 } 

どうなっているのですか?

+2

ああ今、Array.ofSizeはコールバックを取らず、たとえそれがあったとしても、Array.ofSizeの引数として渡すときにコールバックを実行しないでください。 – loldrup

+0

この質問を閉じるには、しかし明らかに私は十分に強力ではない – loldrup

+3

ところで、Integerは不変なので、 'return Integer(myInteger);'に新しいIntegerを初期化する必要はありません。ちょうど 'return myInteger'がやります。 –

答えて

5

私が考案したと仮定しているあなたの例は、Array(0:4)またはArray(0..3)と書かれている可能性があります。しかし、あなたは生成関数をループにしたいためにいくつかの良い理由を持っていると仮定し、ここで私はそれを書くだろうかです:

Array(loop(0)((i) => i+1).take(4)) 

または、同等:

Array(loop(0)(Integer.successor).take(4)) 

あるいは:

Array(loop(0)(1.plus).take(4)) 

これは、外部スコープ内の変数にアクセスするストリームを使用するよりもはるかに優れています(IMO)。

4

ここで何が起きているかを確認しました。コンストラクタArray.ofSize(n, val)は、n倍の配列を作成しています。

あなたはこのかもしれない何をしたい行う方法:

反復可能な列挙内での発現(これはここで{ getInteger() }ある)遅延評価されるたびにイテレータの次

Array<Integer> integers = 
     Array({ getInteger() }.repeat(4)); 

Try it.を)メソッドが呼び出されます(iterableを4回繰り返すことで、ここで4回起こっています)。

代わりにシーケンスの列挙[ ... ]を使用すると動作しないことに注意してください。これらは怠け者ではありません。