文字列から変数名を抽出し、それを変数として使用する可能性はありますか
var myvar:String = "flash";
var flash:Number = 10;
trace( myvar as variable );
そんな感じ
文字列から変数名を抽出し、それを変数として使用する可能性はありますか
var myvar:String = "flash";
var flash:Number = 10;
trace( myvar as variable );
そんな感じ
文字列としての変数名は、次のように実行できます。
this["myvar"] = "flash";
ノート:
ReferenceError
プロパティが以前に定義されておらず、かつ がthis
ではないオブジェクトを参照している場合、これは をスローしますdynamic
。this
もちろん、プロパティを使用したいオブジェクトのインスタンス名に置き換えることができますmySprite["x"]
。this["addChild"](mySprite);
オブジェクトのプロパティとして使用できます。
public dynamic class MyClass {
function MyClass(propName:String, propValue:*) {
this[propName] = propValue;
}
}
また
var myvar:String = "flash";
var o : Object = {};
o[myvar] = 10;
trace(o.flash); //10
どのプロパティ名になるかわからない場合は、dynamic
クラスを使用する必要があります (デフォルトObject
ではです)。dynamic
必要なものはDictionary
.NET のクラスに似ており、デフォルトでObject
AS3 のクラスで使用できます。
var key:String="hello";
var value:int=100;
var map:Object=new Object();
map[key]=value;
これで、保存された値を次のように取得できます
trace(map[key]);
必要に応じて、これに基づいて次のようなクラスを作成することもできます。
public class Dictionary {
private var _keys:Array;
private var _maps:Object;
public function Dictionary() {
_keys=[];
_maps:Object={};
}
//Returns the array of all saved keys
public function get keys():Array {
return _keys;
}
//Sets a key-value pair
public function setProperty(key:*, value:*):int {
_maps[key]=value;
return _keys.push(key);
}
//Returns the value stored at a particular key
public function getProperty(key:*):* {
if(_keys.indexOf(key) != -1) {
return _maps[key];
}
return null;
}
//Removes a key-value pair if it exists and returns if the key existed
public function deleteProperty(key:*):Boolean {
var ix:int;
if((ix=_keys.indexOf(key)) != -1) {
//dissociate value from key
delete _maps[key];
//delete key
_keys.splice[ix,1];
return true;
}
return false;
}
}
そして、これを次のように使用できます。
var dict:Dictionary=new Dictionary();
//set the value
dict.setProperty("flash", 10);
//get the value
dict.getProperty("flash");
//delete if not required
dict.deleteProperty("flash");
これは、任意のタイプのキーと値を設定するために使用できることに注意してください。またReferenceError
、プロパティが定義されていない場合の問題を解決し、YOUR コードで動的クラスを使用する必要はありません (Dictionary
クラスが内部で処理するため)。
これの非常に典型的な用途の 1 つは、解析関数を定義することです。たとえば、スプレッドシート ビューアでは次のようになります。
var parseFuncts:Dictionary=new Dictionary();
parseFuncts.setProperty("csv", Parsers.parseCSV);
parseFuncts.setProperty("xml", Parsers.parseXML);
parseFuncts.setProperty("txt", Parsers.parseTXT);
parseFuncts.setProperty("xls", Parsers.parseXLS);
parseFuncts.setProperty("xlsx", Parsers.parseXLSX);
var fileToOpen:File; //Already contains the file to open
private function open():void {
var f:Function=parseFuncts.getProperty(fileToOpen.extension);
f.apply(this);
}