UnityでUniRxを使用していて、forループ内でうまくストリームを生成したときにバグに遭遇しました。
バグの修正方法はわかったのですが、なぜこのようなバグが起きたのか、またもしコードの描き方がよくないならより良い方法を知りたいです。
バグの内容
入力は0から128までの整数を引数にしてinputProvider.GetVelocity(noteNumber)でReactiveProperty<float>とれるようにしています。
以下のコードでは、入力を見て値が0.1f以上だったらコンソールに出力するストリームをforループ内で生成しています。
C#
1 for (var noteNumber = 0; noteNumber < 128; noteNumber++) 2 { 3 _inputProvider.GetVelocity(noteNumber) 4 .Where(v => v >= 0.1f) 5 .Subscribe(v => 6 { 7 Debug.Log($"note:{noteNumber}, velocity:{v}"); 8 }); 9 }
しかしこれを実行するとどんな入力(どんな引数=noteNumberからの入力)でも、ログには以下のようになってしまいます。
note:128, velocity:入力の値
そこで以下のようにコードを変更すると今度はうまくいきました。
C#
1 for (var noteNumber = 0; noteNumber < 128; noteNumber++) 2 { 3 // 別の変数に代入して使う。 4 var noteSt = noteNumber.ToString(); 5 6 _inputProvider.GetVelocity(noteNumber) 7 .Where(v => v >= 0.1f) 8 .Subscribe(v => 9 { 10 Debug.Log($"note:{noteSt}, velocity:{v}"); 11 }); 12 }
これでわかったのはどうやらnoteNumberをそのまま使うとnoteNumberがループの最後の値=128になってそれが使われてしまうということですが、これがどうして起こってしまったかがよくわからないです。
また、この書き方がもしバッドプラクティスであるならよりよい書き方が知りたいです。
よろしくおねがいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/09 14:51