Arraycollection通过值而不是flex 3中的引用传递给函数

Ste*_*ven 10 apache-flex arraycollection

我想通过flex 3中的函数将arrayCollection#2 =设置为arrayCollection#1.我将两个数组都传递给一个函数并设置arrayCollection#2 = arrayCollection#1.但是,似乎没有通过引用传递arrayCollection#2,因为在函数调用之后,arrayCollection#2没有被更改.我的理解是它应该通过引用和工作传递,我做错了什么?以下是代码:

var AC1:ArrayCollection = new ArrayCollection;
var AC1.addItem(someObject);

var AC2:ArrayCollection = new ArrayCollection;

setAC2(AC1,AC2);
// AC2 is not set to AC1 after the function


private function setAC2(_ac1:ArrayCollection, _ac2:ArrayCollection):void
{
    _ac2 = _ac1;
}
Run Code Online (Sandbox Code Playgroud)

小智 6

请参阅评估策略.

AS使用"按对象传递"/"通过对象共享传递".也就是说,传递"对象"(不是复制,克隆或复制),并且共享对对象的任何修改.

但是,赋值_ac2 = _ac1仅更改[function的local]参数变量的值,并且在函数调用期间不会影响任何变量.传入的唯一内容是值("对象"),它是由函数调用中使用的变量(或任意表达式)的值得出的.

这是因为,如上所述,所用的策略是"通由对象",而不是(如文档状态"通过引用传递",这实际上意味着,或只是"由[的基准]值传递" ..."传递对象").也就是说,"通过引用传递"一词实际上被误用,因此令人困惑.(它在许多语言和文档中被滥用.试图达到共同意义是一场艰苦的战斗.)

如果它真的是 "通过引用传递",那么分配一个新值_ac2将传播出去.(在发表评论说AS是如何"通过引用传递"之前,请查看顶部的链接并认为"通过引用传递"涵盖了C#out/ref,VB ByRef,TSQL output和C++(参考)的情况&- 这些概念不在AS,Javascript或Java).但是,正如在原始帖子中正确指出的那样(以及额外的自我回复),情况并非如此 - 结论:AS不支持"通过引用传递"; 此外,文档(令人困惑地)使用术语"通过引用传递"来表示"按对象传递"/"通过对象共享传递".

有几种方法可以传播出来,按(我的)偏好顺序排序:

  1. 返回新的适用值:AC2 = doSomeTransformation(AC1).这通常是最干净的.避免副作用和令人惊讶的代码.如果适当地包装在对象(或数组)中,则可以返回多个值.

  2. 使用闭包:doSomeTranformation(AC1, function (newValue) { AC2 = newValue })doSomeTransformation可能如下所示:function doSomeTransformation(_ac1, finished) { ...; finished(_ac1) }.我通常只在函数本身的回调"在上下文中运行"或以CPS样式编写代码时才使用它.

  3. 突变一个对象(毕竟AS是"通过对象传递").这非常狡猾,但它会起作用. var blah = {AC2: null}; doSomeTransformation(ac1, blah); ...; laterOn(blah.AC2)doSomeTransformation可能看起来像什么function doSomeTransformation(_ac1, b) { ...; b.AC2 = _ac1; }.一般不推荐.

快乐的编码.


适用的摘录,来自评估策略:

"通过引用呼叫": (正在为"按引用呼叫"我的主要参数不正确地使用的是,它已经具备了定义明确的含义;通过一些语言,如AS和Python通过重载术语只是增加了混淆)

在逐个引用的评估(也称为pass-by-reference)中,函数接收对用作参数的变量的隐式引用,而不是其值的副本.这通常意味着该函数可以修改用作参数的变量 - 其调用者将看到的内容.

"按对象调用"/"通过对象共享调用":(但要注意它承认这些术语的不一致/本地化;术语"引用调用"经常被误用来暗示这些语义和"按值调用"[引用]"在某些情况下使用也意味着相同的事情)

call-by-sharing的语义与call-by-reference的不同之处在于,函数内的函数参数的赋值对调用者是不可见的(与引用语义不同),因此,例如,如果传递了变量,则不是可以在调用者的范围内模拟该变量的赋值.然而,由于功能可以访问相同的对象调用者(没有复制时),突变的那些对象,如果该对象是可变的,在函数内是可见的呼叫者,这可能表现为从呼叫逐不同价值语义.