「参照の値渡し」ということばを初めて聞いた。
まず基本から。プリミティブ型とオブジェクト型の違い。
/* ActionScript3 */
//テスト1
var strA:String = "AAA";
var strB:String = "BBB";
this.strA = this.strB; //BBB, BBB
this.strB = "CCC"; //BBB, CCC
this.strA = "DDD"; //DDD, CCC
//テスト2
var objA:Object = {value: "AAA"}
var objB:Object = {value: "BBB"}
this.objA = this.objB; //BBB, BBB
this.objB.value = "CCC"; //CCC, CCC
this.objA.value = "DDD"; //DDD, DDD
//テスト3
var objA:Object = {value: "AAA"}
var objB:Object = {value: "BBB"}
this.objA = this.objB; //BBB, BBB
this.objB = {value: "CCC"} //BBB, CCC
this.objA = {value: "DDD"} //DDD, CCC
次に実は今まで少し不安だった部分の検証。
引数として受ける時、どんな感じに参照されているか。
これが参照の値渡しってことなのかも。
/* ActionScript3 */
//テスト1
var strA:String = "AAA";
var strB:String = "BBB";
this.strA = this.strB; //BBB, BBB
this.setCCC(this.strB); //BBB, BBB
this.setDDD(this.strA); //BBB, BBB
function setCCC(str:String):void{
str = "CCC";
}
function setDDD(str:String):void{
str = "DDD";
}
//テスト2
var objA:Object = {value: "AAA"}
var objB:Object = {value: "BBB"}
this.objA = this.objB; //BBB, BBB
this.setCCC(this.objB); //CCC, CCC
this.setDDD(this.objA); //DDD, DDD
function setCCC(obj:Object):void{
obj.value = "CCC";
}
function setDDD(obj:Object):void{
obj.value = "DDD";
}
//テスト3
var objA:Object = {value: "AAA"}
var objB:Object = {value: "BBB"}
this.objA = this.objB; //BBB, BBB
this.setCCC(this.objB); //BBB, BBB
this.setDDD(this.objA); //BBB, BBB
function setCCC(obj:Object):void{
obj = {value:"CCC"};
}
function setDDD(obj:Object):void{
obj = {value:"DDD"};
}
たぶん当たり前のことなんだけど、
どこからどこまでが同じメモリの参照なのか
ということがわかりました。
- 参考サイト
AS3では関数の引数はすべて値渡し(call by value)である / flashrod
参照渡し・値渡し - PBD - subtech
func09 » コリン・ムック「今から始めるActionScript 3.0」に行ってきました