Pergunta sobre actionscript-3 – AS3: usando string como variável

4

Existe a possibilidade de extrair o nome da variável da string e usá-lo como variável

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

algo parecido

Sua resposta

3   a resposta
4

Você pode usá-lo como uma propriedade de um objeto.

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

ou

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

Se você não sabe qual nome de propriedade será, então você deve usardynamic classe (Object édynamic por padrão)

5

this["myvar"] = "flash";

Notas:

Isso vai lançar umReferenceError se a propriedade não foi previamente definida E othis refere-se a um objeto que não édynamic.Você pode, claro, substituirthis com o nome da instância de um objeto do qual você deseja usar uma propriedade, por exemplo,mySprite["x"].Você também pode usar essa abordagem para chamar métodos:this["addChild"](mySprite);
1

O que você precisa é semelhante aoDictionary classe no .net, e está disponível por padrão noObject classe de AS3.

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

Agora, você pode obter seu valor armazenado como

trace(map[key]);

Se você quiser, você também pode criar uma classe como esta:

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

E você pode usar isso como:

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

Observe que isso pode ser usado para definir chaves e valores de QUALQUER tipo. Também resolve a questão doReferenceError se a propriedade não está definida, e você não precisa usar nenhuma classe dinâmica no seu código (uma vez que oDictionary classe lida internamente).

Um uso muito típico disso seria definir as funções de análise. por exemplo. em um visualizador de planilha:

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! Nunca procurei por isso, não sabia que existia. Obrigado por me avisar: P Pranav Hosangadi

Perguntas relacionadas