Flex ActionScript 関連覚書などなど

flashrodさんの記事から、メソッドへの引数の渡し方について。

public function swap(a:Object, b:Object):void {
    var tmp:Object = a;
    a = b;
    b = tmp;
}

こんなメソッドを定義して、

var a:Object = {
    value: "abc",
    toString: function():String { return this.value; }
};
var b:Object = {
    value: "xyz",
    toString: function():String { return this.value; }
};
swap(a, b);
trace("a=", a);
trace("b=", b);

こんな感じで実行しても、

a= xyz
b= abc

こうならない。というお話。

ならないだろうとわかってはいるんですが、
言われてみれば参照渡しと言うならできるはず。
こういうところで説明ができない時点で、
なんとなく感覚でやってしまってるんだろうなぁ、と反省しなくては・・・。

結論としては、俗に言う「参照の値渡し」というやつなんですね。

C/C++で書くなら、

#include <stdio .h>
 
void swap(int* a, int* b){
	int* tmp = a;
	a = b;
	b = a;
}
 
int main(){
	int a = 1;
	int b = 2;
 
	printf("a=%d b=%d\n", a, b);
	swap(&a, &b);
	printf("a=%d b=%d\n", a, b);
 
  return 0;
}</stdio>

と、まぁ参照というより、ポインタ使ってるっぽい感じのイメージでいいんですかね。多分。
とりあえず、自分的には理解できてすっきり。

細かい言葉のあやみたいなところではあるんですが、
いつかこういったささいな部分ではまって、時間を無駄にするかもしれないし。
勉強になりました。

コメント

コメント(2) “[AS3]値渡しと参照渡し”

  1. どうも。81会でお世話になりました、t-matsudaです。
    minaco氏に教えてもらってきました。

    このブログ書いてる方だったんですね、ちょい前からFeed読んでましたよ。

    actionscript始めたばっかでまだまだ、わかんない事だらけなので
    いろいろ勉強させてもらいます。

    また、飲みにでも行きましょう。

  2. あるふぁ

    これは、アセンブラで説明すると明快です。

    あるアドレスに格納されている値を、関数に引き渡すとき

    アドレスを渡すのが参照渡しで、値を渡すのが値渡し

    例:8000番地に1という数字が入っている

    8000を渡すのが参照渡し 1を渡すのが値渡し

コメントする