Frage an actionscript-3 – AS3: String als Variable verwenden

4

Gibt es eine Möglichkeit, den Variablennamen aus einem String zu extrahieren und als Variable zu verwenden?

var myvar:String = "flash";
var flash:Number = 10;
trace( myvar as variable );

sowas in der Art

Deine Antwort

3   die antwort
1

Was Sie benötigen, ähnelt demDictionary Klasse in .NET, und es ist standardmäßig in derObject Klasse von AS3.

var key:String="hello";
var value:int=100;
var map:Object=new Object();
map[key]=value;

Jetzt können Sie Ihren gespeicherten Wert als erhalten

trace(map[key]);

Wenn Sie möchten, können Sie auch darauf aufbauen, um eine Klasse wie die folgende zu erstellen:

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;
    }
}

Und Sie können dies verwenden als:

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");

Beachten Sie, dass dies zum Festlegen von Schlüsseln und Werten eines beliebigen Typs verwendet werden kann. Es behebt auch das Problem derReferenceError Wenn die Eigenschaft nicht definiert ist und Sie keine dynamische Klasse in IHREM Code verwenden müssen (seit demDictionary Klasse behandelt es intern).

Eine sehr typische Verwendung davon wäre, Analysefunktionen zu definieren. z.B. in einem Tabellenkalkulationsprogramm:

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);
}
@MartyWallace, doh! Habe nie danach gesucht, wusste nicht, dass es das gibt. Danke, dass du mich informiert hast: P Pranav Hosangadi
5

Variablenname als Strings kann so gemacht werden:

this["myvar"] = "flash";

Anmerkungen:

Dies wird einen werfenReferenceError wenn die Eigenschaft noch nicht definiert wurde UND diethis bezieht sich auf ein Objekt, das nicht istdynamic.Sie können natürlich ersetzenthis mit dem Instanznamen eines Objekts, von dem Sie eine Eigenschaft verwenden möchten, z.mySprite["x"].Sie können diesen Ansatz auch zum Aufrufen von Methoden verwenden:this["addChild"](mySprite);
4

Sie können es als Eigenschaft eines Objekts verwenden.

public dynamic class MyClass {
    function MyClass(propName:String, propValue:*) {
        this[propName] = propValue;
    }
}

oder

var myvar:String = "flash";
var o : Object = {};
o[myvar] = 10;
trace(o.flash); //10

Wenn Sie nicht wissen, wie der Name der Eigenschaft lauten wird, sollten Sie verwendendynamic Klasse (Object istdynamic standardmäßig)

Verwandte Fragen