【问题标题】:What's the cleanest way to simulate pass-by-reference in Actionscript 3.0?在 Actionscript 3.0 中模拟传递引用的最简洁方法是什么?
【发布时间】:2010-09-08 03:00:54
【问题描述】:

Actionscript 3.0(我一般假设是 Javascript 和 ECMAScript)缺少对 int 等原生类型的传递引用。结果,我发现从函数中取回值真的很笨重。解决这个问题的正常模式是什么?

例如,有没有一种干净的方法可以在 Actionscript 中实现 swap( intA, intB )

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    我相信您能做的最好的事情就是将容器对象作为参数传递给函数并更改该对象中某些属性的值:

    function swapAB(aValuesContainer:Object):void
    {
        if (!(aValuesContainer.hasOwnProperty("a") && aValuesContainer.hasOwnProperty("b")))
            throw new ArgumentError("aValuesContainer must have properties a and b");
    
        var tempValue:int = aValuesContainer["a"];
        aValuesContainer["a"] = aValuesContainer["b"];
        aValuesContainer["b"] = tempValue;
    }
    var ints:Object = {a:13, b:25};
    swapAB(ints);
    

    【讨论】:

    • hasseg,我希望有人知道更优雅的技巧,但您的答案似乎是最好的。我想自然的跟进是:这个限制是否会让其他人发疯,还是只有我一个人? :)
    • 它时不时让我有点发疯。我不认为你在那个问题上太孤单了。
    【解决方案2】:

    我想另一种选择是在某个地方定义这种事情......

    public class Reference {
        public var value:*;
    }
    

    然后,如果您真的只是在寻找“输出”参数并在输入或不输入的过程中初始化它们,那么您的交换将变为:

    function swap(Reference a, Reference b) {
        var tmp:* = a.value;
        a.value = b.value;
        b.value = tmp;
    }
    

    而且您总是可以发疯并定义特定的 IntReference、StringReference 等。

    【讨论】:

      【解决方案3】:

      这是吹毛求疵,但intStringNumber 和其他的是通过引用传递的,只是它们是不可变的。当然,效果和传值一样。

      【讨论】:

        【解决方案4】:

        您也可以使用包装器代替 int:

        public class Integer
        {
            public var value:int;
        
            public function Integer(value:int)
            {
                this.value = value;
            }
        }
        

        当然,如果您可以使用运算符重载,这将更有用...

        【讨论】:

          【解决方案5】:

          看看一些 Java 代码。 Java 从一开始就有一个约定,即引用类型通过引用传递,原始类型通过值传递。从很多方面来看,它都是一个非常好的模型。

          但是谈到交换,在 Java/AS3 中进行交换的最好和最简单的方法是使用以下三行:

          var temp:int = array[i]; 数组[j] = 数组[i]; 数组[i] = 温度;

          实际上没有任何理由使用函数进行简单的交换,因为您只需 3 行就可以更快地完成。

          【讨论】:

            【解决方案6】:

            这很烦人。但是如果你使用不同的习语而不是例如C#,您可以获得合理质量的结果。如果需要来回传递很多参数,传入一个填充了所需数据的对象,返回时更改对象的参数。 Object 类就是为了这类事情。

            如果只需要返回一堆数据,返回一个Object。这更符合 ECMAScript 风格,而不是 pass-by-ref 语义。

            【讨论】:

              【解决方案7】:

              解构赋值(例如 [a,b] = [b,a])没有在 ECMA-262 3 规范中定义,也没有在 JavaScript 1.5 中实现,该版本相当于 IE 中的 JScript 实现.我在 AS4 规范预览中看到过这种语法,我相信它是 JavaScript 1.7 的一部分。

              【讨论】:

                【解决方案8】:

                如果 ActionScript 像 Javascript 一样工作,

                [a,b] = [b,a]
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-04-15
                  • 2011-01-10
                  • 2011-04-10
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-03-01
                  • 1970-01-01
                  • 2013-04-21
                  相关资源
                  最近更新 更多