Fai*_*ash 3 flash actionscript-3
我实际上是在寻找一种方法来通过AS3中的参考传递,但后来似乎adobe和许多人对通过引用传递的理解与我在大学里所教授的不同.我被教过java传递的值和C++允许通过引用传递.
我并不想争论通过价值和参考传递的是什么.我只想解释为什么我在问题中使用pass by object ...
回到问题,我想做的事情如下:
public function swapCard(cardA:Cards, cardB:Cards) {
var temp:Cards = cardA;
cardA = cardB;
cardB = temp;
}
...
swapCard(c1, c2);
Run Code Online (Sandbox Code Playgroud)
编辑:添加两个关于我如何使用swapCard函数的例子
1)在播放器1和播放器2之间交换卡片的过程中
swapCard(player1.hand[s], player2.hand[t]);
Run Code Online (Sandbox Code Playgroud)
2)在玩家1的牌和牌组之间交换牌的过程中
swapCard(player1.hand[s], player1.deck[rand]);
Run Code Online (Sandbox Code Playgroud)
在C++中,我们只需要在参数之前添加一个符号以使其工作(我们称之为通过引用传递).但在AS3中,cardA和cardB只是指向形式参数的指针.在函数中,更改指针对形式参数没有任何作用:(
我一直在寻找几个小时,但在没有知道卡的所有属性的情况下我找不到办法.
如果我必须逐个更改卡的属性,那么我应该将swapCard更改为类卡中的静态功能?(因为我不想把所有东西暴露给另一个班级)我不确定这是不是一个好习惯.这就像在类Cars中添加swap_cars函数一样.如果我让这件事发生,接下来会发生什么?洗车,借车,租车...我真的想保持卡类清洁,只保留卡的详细信息.有可能在AS3中正确完成此操作吗?
swap在AS3中无法实现您尝试实现的功能.输入参数是对输入对象的引用,但引用本身是按值传递的.这意味着函数内可以改变cardA和cardB,但这些变化不会在函数外可见.
编辑:我在您使用示例用法编辑问题后添加了此部分.
看起来你正试图在两个不同的数组中交换每个给定数组位置的两个对象 - 你可以在AS3中为此创建一个函数,但不是你尝试的方式.
一种可能的实现方式是传递数组本身以及您尝试交换的位置; 这样的事情:
// Assumes arrays and indices are correct.
public function SwapCards(playerHand:Array, playerCardIndex:int,
playerDeck:Array, playerDeckIndex:int):void
{
var tempCard:Card = playerHand[playerHandIndex];
playerHand[playerHandIndex] = playerDeck[playerDeckIndex];
playerDeck[playerDeckIndex] = tempCard;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您仍然交换引用,并且数组本身仍然通过引用传递(并且数组引用按值传递 - 如果需要,您可以将数组更改为此函数内的新数组,但您不会在外部看到新数组).但是,因为数组参数引用函数内部和外部的相同数组,所以可以更改数组(或其他数组属性)的内容,并且这些更改将在外部可见.
这种解决方案比克隆卡更快,因为这涉及为新Card实例分配内存(这是昂贵的),并且临时实例也必须由垃圾收集器释放(这也是昂贵的).
您在评论中提到您将卡片传递到较低级别的代码 - 如果您没有对阵列的后向引用(以及卡片的位置),您将无法轻松交换卡片 - 在AS3中,所有输入参数都是副本(基本类型的值的副本或复杂对象的引用的副本 - 函数中输入参数的更改在外部不可见).