【问题标题】:actionscript dictionary contain functionactionscript 字典包含函数
【发布时间】:2010-10-29 01:23:18
【问题描述】:

我想初始化c4.currentState='down'等所有状态,这样我就可以调用字典键来执行函数了,可以吗?

private var keyMap:Dictionary = new Dictionary();
private var c4v1:Object = new Object();
private var c4v0:Object = new Object();


private function initial_keyEvent():void {
    keyMap[c4v1] = "c4.currentState='down'";

}

private function call_keys():void {
    keyMap[c4v1];
}

【问题讨论】:

    标签: apache-flex actionscript-3 actionscript air


    【解决方案1】:

    尝试一个函数作为字典的值。像这样的:

    private var keyMap:Dictionary = new Dictionary();
    private var c4v1:Object = new Object();
    private var c4v0:Object = new Object();
    
    public function changeC4State():void{
      c4.currentState='down';
    }
    
    private function initial_keyEvent():void {
        keyMap[c4v1] = changeC4State;
    }
    
    private function call_keys():void {
        var myFunc : Function = keyMap[c4v1];
        myFunc();
    }
    

    查看 ArrayCollection 的 FilterFuntion 属性或列表类 LabelFunction 了解更多信息。

    【讨论】:

      【解决方案2】:

      Currying 会帮助你! 另外,请查看Command 模式。

      package {
          import flash.events.TimerEvent;
          import flash.utils.Timer;
          import flash.utils.Dictionary;
          import flash.display.Sprite;
      
          public class Main extends Sprite {
              private var dictionary : Dictionary;
      
              public function Main() {            
                  dictionary=new Dictionary();
      
                  var foo1:Foo=new Foo("John");
                  var foo2:Foo=new Foo("Jane");
      
                  dictionary[0]=curry(foo1,"Hello world");
                  dictionary[1]=curry(foo1,"My name is John");
                  dictionary[2]=curry(foo2,"Hello King Kong");
                  dictionary[3]=curry(foo2,"My name is Jane");
      
                  var timer:Timer=new Timer(1000,1);
                  timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerComplete);
                  timer.start();
      
                  function curry(foo:Foo,message:String) : Function {
                      var f : Function = function():void {
                          foo.traceIt(message);
                      };
                      return f;
                  }
              }
      
              private function timerComplete(e : TimerEvent) : void {
                  Timer(e.target).removeEventListener(e.type, arguments.callee);
                  dictionary[0]();//John trace : Hello world
                  dictionary[1]();//John trace : My name is John  
                  dictionary[2]();//Jane trace : Hello King Kong  
                  dictionary[3]();//Jane trace : My name is Jane
      
              }
          }
      }
      
      class Foo {
          private var name : String;
      
          public function Foo(name:String) {
              this.name = name;
          }
      
          public function traceIt(message:String):void{
              trace(name,"trace :",message);
          }
      
      
      }
      

      【讨论】:

      • 能否详细说明您的代码与 Switch 语句相比有何优势?
      • 我的解决方案与 switch 语句无关...我错过了什么...?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      相关资源
      最近更新 更多