2012-05-21 66 views
4

是否有可能從字符串中提取變量名,並用它作爲變量AS3:使用字符串可變

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

類似的東西

回答

4

你可以使用它作爲一個對象的屬性。

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類(Objectdynamic默認)

5

變量名作爲字符串可以這樣做:

this["myvar"] = "flash"; 

說明:

  • ,這將拋出一個ReferenceError如果屬性尚未以前定義和this指的是對象,它是不是dynamic
  • 當然,您可以用this替換要使用屬性的對象的實例名稱,例如, mySprite["x"]
  • 您也可以使用這種方法來調用方法:this["addChild"](mySprite);
1

你所需要的是類似於在.NET中Dictionary類,它是默認可用在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"); 

不是e這可以用來設置任何類型的鍵和值。如果該屬性未定義,並且您不需要在代碼中使用任何動態類(因爲Dictionary類在內部處理它),它也解決了ReferenceError的問題。

一個非常典型的用法是定義解析函數。 例如在電子表格中觀看者:

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); 
} 
+0

[AS3具有'Dictionary'類(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Dictionary.html) – Marty

+0

@MartyWallace,哈哈!從來沒有找過它,不知道它存在。感謝您告訴我:P –