仕事で関数から戻り値をハッシュで返そうとしていたのですが、
うまく返ってくれなくて悩んでいたのですが調べてみると

return;
ストリング、数値、配列、またはオブジェクトで、これを'function'の値として評価して返します。
この引数は省略することができます。

と書かれていました。
ハッシュでは戻せないのですね、今までハッシュで戻す事なんて
無かったから知らなかったです、いつもストリング、数値、配列位だったので・・・(w。
で、配列で戻すのもあとあとチェックが面倒なので新しくオブジェクトを生成して
オブジェクトにプロパティとしてデータを持たせる事で回避した。
うっかりわすれてしまいそうなのでメモ。

newDates=new Object(getDate(this.dates));

function getDate(DATE) {
newDates = new Object();
newDates.test = test[DATE];
newDates.test2 = test2[DATE];
return newDates;
}

こんな感じにした。
でもこれより良い方法がありそう・・・。

参考:野中文雄さんの Macromedia Flash非公式テクニカルノート return


FLASHのヘルプにもチャンと書いていた・・・(w

説明
ステートメント; 関数から返される値を指定します。return アクションは、expression を評価し、
その結果をアクションが実行される関数の値として返します。
return アクションは、関数の実行を停止し、関数を戻り値で置き換えます。
return ステートメントを単独で使用したときの戻り値は null です。

複数の値を取得することはできません。 複数の値を取得しようとした場合は、
最後の値だけが返されます。 たとえば、次の例では c が返されます。

return a, b, c ;

で、複数に渡る時には配列、オブジェクトで持たせないと駄目だと理解しました。

追記:
サンプル関数
// ------------------------------------
// 整数変換関数
// 定義:mathFloors();
// 引数:arguments変数に格納するので何個でも返す
// 戻り値:arguments | 配列で返すので受け取りは変数
// ------------------------------------
function mathFloors() {
for (var i=0;i arguments[i] = Math.floor(arguments[i]);
trace(arguments[i]);
}
return arguments;
}

Comments

複数の返り値の管理ってメンドクサイですよね。

僕もそのやり方ですが、モノグサなので匿名オブジェクトで返しちゃってます。

t = test[DATE] ;
t2 = test2[DATE];
return {test:t, test2:t2};

別の方法としてはargumentsとか使って自動的に、リターン用のオブジェクトを造る関数を組んじゃうとかどうでしょう。

http://kinaka.ciao.jp/archives/2004/03/20040323_1358.php

Posted by: Taka at June 7, 2004 07:14 PM

匿名オブジェクトですか、
そう言う方法もあるのですね。
takaさん、教えてくださってありがとうです。
なるほど、もう少し柔軟な発想もしなければ・・・。

リターン用のオブジェクトを造る関数・・・。
う〜ん、どのようにして汎用性を持たせるのか
イマイチ理解が・・・。
もう少し教えて下さったリンクを見て考えます。

Posted by: rakeem at June 7, 2004 07:38 PM

argumentsと言うものを知らなかったのでメモ。
FLASHのヘルプにはドキュメント化されていなかったです。
で、いつものように野中文雄さんのサイトで
調べてみました(w。

関数を実行すると、Argumentsオブジェクトが、
その関数のローカル変数'arguments'に格納される。

引き数値は配列アクセスでゲット。

Posted by: rakeem at June 8, 2004 11:46 AM

またまたメモ。

function returnDates () {
for (var i = 0;i<arguments.length;i++) {
arguments[i] = "test"+arguments[i];
}
return arguments;
}

出力結果
newDates=new Array(returnDates("a", "b"));
trace(newDates[0][1]);
結果:testb
newDates=new Object(returnDates("a", "b"));
trace(newDates[1]);
結果:testb
newDates=(returnDates("a", "b"));
trace(newDates[1]);
結果:testb

----------------------------
Argumentsオブジェクトの戻り値を
配列に格納しようとしたら二重配列のように
なり、変数に格納したら配列に。
よく分からんがArgumentsオブジェクトの受け取りは
変数にすればよいのか?

Posted by: rakeem at June 8, 2004 03:13 PM

ダイレクトに書いてるので動かない恐れがありますが… こんな感じでどうでしょう?

引数は、プロパティ名、値0、値1、値2…
で投げると
プロパティ0、プロパティ1、プロパティ2… を格納したオブジェクトを返してくれる(予定)の関数です。


return("test",a,b,c);

function retObj (prop) {
var imax = arguments.length;
var obj = new Object();
for (var i = 1;iArgumentsオブジェクト
Argumentsはオブジェクトなんですが、argumentsは単なるローカル変数な配列みたいです。

なので、そのままargumentsをreturnすると、配列が返されるみたいっす。で、配列に入れると二重配列、変数に入れても配列になるみたいです。

Posted by: Taka at June 10, 2004 12:37 AM

すいません・・・ 上の奴ミスです。申し訳ありませんが、消してくださいませ…


ダイレクトに書いてるので動かない恐れがありますが… こんな感じでどうでしょう?

引数は、プロパティ名、値0、値1、値2…
で投げると
プロパティ0、プロパティ1、プロパティ2… を格納したオブジェクトを返してくれる(予定)の関数です。

function retObj (prop) {
var imax = arguments.length;
var obj = new Object();
for (var i = 1;iArgumentsオブジェクト
Argumentsはオブジェクトなんですが、argumentsは単なるローカル変数な配列みたいです。

なので、そのままargumentsをreturnすると、配列が返されるみたいっす。で、配列に入れると二重配列、変数に入れても配列になるみたいです。

Posted by: Taka at June 10, 2004 12:41 AM

あ、ダメだ… どうもコードがスクリプトで蹴られてるみたいです。 ホント御免なさい。

Posted by: Taka at June 10, 2004 12:42 AM

Takaさん、わざわざコードを書いてくださってありがとです。
これが出来たら何かと便利だったりするのですが・・・。

全然勉強になるので感謝です。

Posted by: rakeem at June 10, 2004 10:02 AM
Post a comment









Remember personal info?