• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:objectから数値を取り出すには?)

オブジェクトから数値を取り出す方法とは?

このQ&Aのポイント
  • flashMX2004のactionscriptについて質問です。あるユーザー定義関数の中で作った変数をあとから利用しようとしても、その中身自体は参照できるが、演算や他の変数への代入ができない状況です。
  • 具体的には、ユーザー定義関数A内で配列haiAおよびhaiBを定義し、重複しないランダムな数字を格納しています。別のユーザー定義関数B内でhaiCを用意し、haiC[i]=haiA[i]+haiB[i]を実行したいのですが、NaNが返ってきています。
  • 配列を定義した直後に適当な数値を代入して演算すると正常に動作するため、問題はランダム生成&代入のプロセスにある可能性がありますが、理解が追いついておらず、よくわかりません。アドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#35109
noname#35109
回答No.1

確かに関数もオブジェクトです。 しかし, 関数はオブジェクトであるとかオブジェクトでないとかいう問題ではなく, また, オブジェクト内の変数を取り出すとかいう前に, 関数内の変数は,関数の処理終了後削除されます。 「変数」 http://homepage3.nifty.com/ginga-b/MX/variables.html  ~中段下あたり 「変数の種類」より引用 ~ > ローカル変数は、functionの実行時のみ存在し、 > 終了と同時にメモリ上から削除されます。 > function以外の場所で、var宣言しても、 > ローカル変数とはならず、 > メモリ上から削除されることはありません。 というわけで, ユーザー定義関数 A() で作成された(される)変数を ユーザー定義関数 B() で使いたい場合は次のような方法取ります。 ・A() の実行段階でその中の変数は外へ出して,  後からその変数を B() で使う。 ・A() を実行する前に B() を実行させて,  そこから A() に引数を渡す。 ・B()の変数は外へ出して置いて,  後からその変数を A() で使用する。  などなど… 次に,失敗例 と 成功例のいくつか を示します。 あくまでも例です。 また,重複しないランダムな配列要素を作成する部分は省略しています。 また,全ての変数の型指定は話がややこしくなるので省略しています。 (元から私は厳密な型指定はあまり使いませんが。) つまり,それらについて触れると, 場合分けがさらに多くなって本題が見えにくくなるので省略しています。 //--- 失敗例 -------------- // // ユーザー定義関数 A の定義 function A() { var haiA = new Array(1, 3, 5, 7, 9, 2, 4, 6, 8, 10); var haiB = new Array(2, 4, 6, 8, 10, 1, 3, 5, 7, 9); } // // ユーザー定義関数 B の定義 function B() { var haiC = new Array(); for (var i = 0; i<=9; i++) { haiC[i] = haiA[i]+haiB[i]; } trace(haiC); //↑結果:NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN } // // ユーザー定義関数 A と B の実行 A(); B(); //------------------------- ↑A() の実行後,即,   ローカル変数 haiA と haiB は削除されるので,   B() からその変数は参照できません。 //--- 成功例 1 -------------- // // 配列 haiA haiB の作成 var haiA = new Array(); var haiB = new Array(); // // ユーザー定義関数 A の定義 function A() { haiA = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]; haiB = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9]; } // // ユーザー定義関数 B の定義 function B() { var haiC = new Array(); for (var i = 0; i<=9; i++) { haiC[i] = _root.haiA[i]+_root.haiB[i]; } trace(haiC); // ↑結果:3,7,11,15,19,3,7,11,15,19 } // // ユーザー定義関数 A と B の実行 A(); B(); //------------------------- ↑変数 haiA と haiB をあらかじめ _root に作成し,   A() の実行ではまずその変数を書きかえ,   B() からその変数を参照するので成功します。 //--- 成功例 2 -------------- // // ユーザー定義関数 A の定義 function A() { _global.haiA = new Array(1, 3, 5, 7, 9, 2, 4, 6, 8, 10); _global.haiB = new Array(2, 4, 6, 8, 10, 1, 3, 5, 7, 9); } // // ユーザー定義関数 B の定義 function B() { var haiC = new Array(); for (var i = 0; i<=9; i++) { haiC[i] = _global.haiA[i]+_global.haiB[i]; } trace(haiC); // ↑結果:3,7,11,15,19,3,7,11,15,19 } // // ユーザー定義関数 A と B の実行 A(); B(); //------------------------- ↑A() の実行で haiA と haiB は   グローバルな変数として作成されます。   B() からそのグローバル変数を参照するので   成功します。 //--- 成功例 3 -------------- // // ユーザー定義関数 A の定義 function A() { var haiA = new Array(1, 3, 5, 7, 9, 2, 4, 6, 8, 10); var haiB = new Array(2, 4, 6, 8, 10, 1, 3, 5, 7, 9); // haiA と haiB を連結して戻り値として返す return (haiA.concat(haiB)); } // // ユーザー定義関数 B の定義 function B() { var haiC = new Array(); // 配列 haiD に A() の戻り値を代入 var haiD = new Array(); haiD = A(); for (var i = 0; i<=9; i++) { haiC[i] = haiD[i]+haiD[i+10]; } trace(haiC); // ↑結果:3,7,11,15,19,3,7,11,15,19 } // // ユーザー定義関数 B の実行 B(); //------------------------- ↑まず B() が実行され,   B() から A() を実行させ値を取ってきます。   A() には戻り値を返し,   B() はその戻り値を受け取って   後の処理をするため成功します。 //--- 成功例 4 -------------- // // ユーザー定義関数 B の定義 function B(m, n) { var haiA = new Array(); haiA = m; var haiB = new Array(); haiB = n; var haiC = new Array(); for (var i = 0; i<=9; i++) { haiC[i] = haiA[i]+haiB[i]; } trace(haiC); // ↑結果:3,7,11,15,19,3,7,11,15,19 } // // ユーザー定義関数 A の定義 function A() { var haiA = new Array(1, 3, 5, 7, 9, 2, 4, 6, 8, 10); var haiB = new Array(2, 4, 6, 8, 10, 1, 3, 5, 7, 9); // ユーザー定義関数 B の実行 B(haiA, haiB); } // // ユーザー定義関数 A の実行 A(); //------------------------- ↑まず A() が実行され,   A() から B() を実行させますが,   そのとき B() に引数を送ります。   B() はその引数を受けとって   後の処理をするため成功します。 他にもまだ方法や場合があるとは思いますが, このような方法である関数の値を別の関数ので参照させます。 だいたいは 「成功例 2」のグローバル変数を作成する方法か, 「成功例 4」の次の関数へ引数を渡す方法を使うことが多いのではないかと思います。 「成功例 2」ではグローバル変数を使用していますが, グローバルではなくて, _root に変数を置いても,また MC の中に変数を置いても良いです。 とにかく関数外に変数を出すということが必要です。 ~・~ オマケ ~・~・~・~・~・~・~ 「重複しないランダムな整数配列の作成 」 //------------------- var nyuuArr = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); var mylen = nyuuArr.length; // 出力配列の作成 var syutsuArr = new Array(); // for (i=0; i<mylen; i++) { // // nyuuArr の要素数までの整数の乱数を取得 var ran = Math.floor(Math.random()*nyuuArr.length); // // 出力配列 に入力配列の乱数番目の要素を代入 syutsuArr[i] = nyuuArr[ran]; // // 入力配列の乱数番目の要素を抜き取る // (nyuuArr.length はこの時点で1つ減る) nyuuArr.splice(ran, 1); // } // trace(syutsuArr); //------------------- (ひょっとして使えましたら… のオマケです。)

pkpkpkpk
質問者

お礼

素晴らしい回答ありがとうございます。 論理的で大変分かりやすく、感動に打ち震えております。。 何時間も一人で悩んでいたのが嘘のように問題解決しました。 また様々な方法を示して頂いたお陰で、 知識がかなり深まりました。 ランダム整数配列のスクリプトも、作っていたものよりも はるかにシンプルで分かりやすかったので、 早速参考にさせていただきました。 この度は本当にありがとうございました。

関連するQ&A