【问题标题】:Updating an Array that belongs to one class from another class从另一个类更新属于一个类的数组
【发布时间】:2013-01-27 12:11:11
【问题描述】:

我很久以前写过这段代码,当时我以为我理解了它,但现在我试图弄清楚它是如何工作的......

// Main.as

package {
    public class Main {

        public function Main() {
            var fruit:Array = [];
            UpdateClass.update(fruit);
            trace(fruit); // Traces out the string pushed into it? How??? I think the data would've got lost...
        }

    }
}

// UpdateClass.as

package {
    public class UpdateClass {

        public static function update(array:Array):void {
            array.push("haha, this is not a fruit!");
        }

    }
}

我只是不明白 UpdateClass 是如何管理更新 Main 的水果数组的?我认为数据会丢失,因为它没有返回新数组?...当我尝试使用字符串和数字时,数据确实会像预期的那样丢失。

我不知道我写这篇文章的时候在做什么,但我想尝试理解这背后的逻辑。

谢谢。

【问题讨论】:

    标签: arrays actionscript-3 oop class object


    【解决方案1】:

    StringNumber 是 AS3 中的“原始”数据类型,而 Array 和其他对象(如 MovieClip)是“复杂”或“参考”数据类型。

    当您传递原语时,它的值会被复制,因此修改不会影响原始值。当您传递一个复杂对象时,它实际上是对该对象在内存中的地址的引用,因此您的函数正在修改原始对象。

    【讨论】:

      【解决方案2】:

      当您说字符串和数字丢失了值时,我假设如下:

      // UpdateClass.as
      
      package {
          public class UpdateClass {
      
              public static function update(num:Number):void {
                  num = 1;
              }
      
          }
      }
      

      它丢失的原因是因为您将原始对象的引用作为 num。但是函数更新将该引用更改为另一个包含值“1”的 Number 对象。如果您将另一个数组分配给传递的引用,这对于数组也是如此:

      // UpdateClass.as
      
      package {
          public class UpdateClass {
              public static function update(array:Array):void {
                  array = new Array();
                  array.push("haha, this is not a fruit!");
              }
      
          }
      }
      

      但是,由于您只是在传递的引用上调用方法(push),'array' 仍然引用原始 Array 并对其进行更新。

      【讨论】:

        猜你喜欢
        • 2014-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-05
        • 1970-01-01
        相关资源
        最近更新 更多