- ベストアンサー
[return]の役割について
- ActionScript 3.0のバージョンでの[return]の役割について質問しています。
- 質問者は、参考書籍で[returnは関数内の値を戻します]とされているが、具体的な理解ができていないと述べています。
- 例示されたコードでは、イベントディスパッチャーを介して[mover]関数の値を返しているが、[return]の真価がわからないという状況です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
英語の” return ”には、「返す」という他に「元の場所に戻る」「戻す」といった意味もあります。 プログラミングの本では ActionScript に限らず、return 文は往々にして「値を返す」と説明されていますが、英語の return と同様に、「値を返す」だけでなく「元に戻る」という機能もあります。 コンピュータのプログラムは、たくさんの命令がメモリの中に格納されていて、命令は並んでいる順番に実行されていきます。 関数は関連する複数の命令をひとかたまりにしたもので、やはりメモリ内に格納されますが、メインのプログラムとは別の場所に分けて格納されます。 関数を呼び出すと、もとのプログラムの流れから一旦外れ、関数が格納されているところから順番に命令を読み取り、実行されるようになります。 そして、関数が終了した時には、再びもとのプログラムの流れに「戻る」のです。 関数は本流から一旦離れて支流に寄り道するようなものですから、用が済んだら本流に戻らなければなりません。 return 文を入れると、その場で呼び出し元である本流の方に戻ります。 この機能を利用して、関数を最後まで実行しなくてもいい場合に、return 文により関数の処理を任意の箇所で打ち切ることができます。 例えば、引数で指定したものを探し出して加工する、という関数があるとしましょう。 探すものが見付かったのなら関数内で次の加工処理に取りかかるのですが、なかった場合はやることがありません。 この例では、探しものが見当たらないと分かった時点で、return 文により関数を打ち切ることができます。 これは無駄な処理をせずに済むばかりでなく、問題のある引数が渡されてきた時、そのまま処理を続けると困るので関数を中断させたい場合などにも使える方法です。 関数の冒頭で引数をチェックし、何か問題があると分かったら、その時点で return 文で戻ってしまえば、問題含みのまま処理を続けて重大な障害や深刻なバグに進展するようなこともなくなります。 *********************************** 関数から呼び出し元に戻る際に、何かの値を1つだけ持ち帰ることができます。 これが解説書でもしばしば説明されている、return 文の「値を返す」機能です。 関数から持って帰ってくる値を「戻り値」といいます。 ActionScript の文法では、function 文の終わり(最後の” } ”)までが関数と見なされ、return 文がなくても関数が終了して自動的にもとのスクリプトの流れに戻っていきます。 関数の終端に達して自動的に戻った場合、関数から持ち帰る値は何もありません。 return 文を使って戻ると、何かの値を持ち帰ることができます。 もちろん、持ち帰りたい値がなければ、return 文を使っていても何も持たずに戻ることもできます。 先述のように関数の途中で return 文で戻る場合でも、値を持ち帰ることができます。 先の例でいうと、引数で指示されたものを探索した結果、 ・探しものが見付からない時は、加工処理に移らず、-1 を持って帰る( return で -1 を返す) ・探しものはあったが加工に失敗した場合は、加工処理を途中で打ち切り、0 を持って帰る( return で 0 を返す) ・探しものが見付かり、加工処理も無事に終了したら、成功の証として 1 を持って帰る( return で 1 を返す) ・・・というに設計したとします。 すると、関数からの戻り値を見ることで、処理が正常に行われたのか、それとも失敗して打ち切られたのか、失敗したのなら原因は何かを判断できるようになります。 また、失敗した時には return 文により途中で処理が打ち切られるのですから、余計な処理を続けたり、問題があって危険な状態のまま突っ走ってしまうようなこともなくなります。 なお、return 文で持っていける値は”1つだけ”です。 複数の値を持ち帰りたい時は、Object 型の変数にまとめるなどの工夫が必要です。 *********************************** ところで、ActionScript 1.0 や 2.0 でよく見かける ○○.onRelease = function() ・・・ というような書き方があります。 ” function ”とあるからには関数を定義しているわけですが、この関数の中に return 文、特に、値を返す目的での return 文はあまり見かけないと思います。 ActionScript 3.0 では名前のある関数を定義し、addEventListener メソッドで登録する形式に変わりましたが、登録する関数の中に return 文はまずないでしょう。 なぜでしょうか? return 文には、「呼び出し元に戻る」「戻る際に値を1つだけ持ち帰る」という、2つの機能がありました。 持ち帰った値は、関数の呼び出し元に受け取る権利があります。 ActionScript は”イベント駆動型”という考え方を採用しています。 これは、ボタンが押される・マウスが操作されるなど、ムービー再生中に起こる様々な出来事(イベント)を監視しているプログラムが、ユーザーの組んだスクリプトとは別に裏方で動いており、イベントが発生した時に予めイベントハンドラに登録されている関数を呼び出してくれる仕組みのことです。 イベントが起きた時に呼び出される関数の呼び出し元は、イベント処理を実際に担当しているプログラムです。 従って、これらの関数からの戻り値を受け取る権利があるのも、このプログラムということになります。 イベント発生時に呼び出される関数を呼び出すのが自分ではないために、ユーザーはその戻り値を受け取ることができません。 つまり、値を返す関数にしたところで返ってきた値を参照できないので、イベントにより呼び出される関数には return 文を入れてもあまり意味がないのです。 自作した関数や ActionScript で用意されている関数・各クラスのメソッドを自分のスクリプトの中で呼び出す時は、呼び出し元は自分になります。 ですから、関数から返ってくる値を好きなように利用することができます。 ----------------------------------------------------------- ActionScript はイベントを利用した処理が多くを占めます。 イベント発生時に呼び出される関数からは戻り値を受け取れないために、作る関数に return 文を入れることが少なく、だから「 return 文はどんな時、何のために使う??」と疑問に思うのではないでしょうか。 何かの仕事をしてその結果を返してくれたり、成功 / 失敗などの状況に応じて返ってくる値や作業の結果が変わる関数やメソッドは全て、return 文を利用しています。 自分ではあまり使う機会がなくても、return 文は見えないところでたくさん活躍しているのです。 イベント処理ではない関数を自作する時にも、上手く使えば安全で堅牢な設計の関数になります。 いろいろな使い方を研究してみてください。
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
関数を使うときの使い方の問題です。 例えば ballMC というムービークリップがあったとします。 ballMC.x = Math.random()*500; これで, ballMC の x座標が 0以上500未満 のどこかわからないランダムな場所に移動します。 Mathクラスの random メソッドの戻り値が 0以上1未満のランダムな数(Number) ですから, その 戻り値 に 500 を掛けることによって 0以上500未満 の数を得ているわけです。 つまり, random メソッドの戻り値(returnされる値)が 0以上1未満 の乱数ですからその戻り値を利用しているのです。 関数でも同様です。 何かを return させるとその値を戻り値として利用できますから, そういう使い方をするときに便利です。 ---大まかな例--- 身長(cm)からその平均体重(kg)を求め,その値を return させるという 「身長_体重変換」 という関数を作成したとします。 a = 身長_体重変換(170); これで身長170cmの人の平均体重が a に代入されますから,このように使いたい場合便利ですよね。 また同じ return で, if (身長_体重変換(170) + 20 < 私の体重) { trace("私太りすぎ") } else if (身長_体重変換(170) - 20 > 私の体重) { trace("私痩せすぎ"); } else { trace("私ほどよい体重"); } このように使うことも当然可能です。 return付き関数は,正に "関数"(数学で言う関数/函数) です。 (ある値に対して,ただ1つの値が対応するような関係があるとき,この関係を関数という。) 関数を本来の数学的関数らしく使うときの使い方が return 返す使い方です。 void は戻り値のないプログラム上で発展した形の関数です。 ※数学的とは言っても戻り値は数とは限りません。 オブジェクトを返す場合もあれば配列を返す場合もあります。 例 // 文字列「あいうえお。かきくけこ」を「。」で分割して配列 arr を得る arr = ("あいうえお。かきくけこ").split("。");
お礼
早速のご回答、ありがとうございます! 通常、どの入門書籍に載っている内容をここまで事細かく説明して頂き有難う御座います。 ご回答を拝見させて頂いた限りでは、わたしの[return]の認識が間違っていた様で、大変参考になりました。 DPE様の文末でのご指摘どおり、再度勉強し直そうと思う次第であります。 重ねて御礼申し上げます。有難う御座いました!