gpt4 book ai didi

actionscript-3 - AS3 : how to pass by "object"

转载 作者:行者123 更新时间:2023-12-04 02:18:38 25 4
gpt4 key购买 nike

我实际上是在寻找一种在 AS3 中通过引用传递的方法,但后来发现 adobe 和很多人对通过引用传递的理解与我在大学里学到的不同。我被告知 java 是按值传递的,而 C++ 允许按引用传递。

我并不是要争论什么是值传递和引用传递。我只想解释为什么我在问题中使用对象传递...

回到问题,我想做这样的事情:

public function swapCard(cardA:Cards, cardB:Cards) {
var temp:Cards = cardA;
cardA = cardB;
cardB = temp;
}

...

swapCard(c1, c2);

编辑:添加两个关于我如何使用 swapCard 函数的例子

1) player1和player2手牌交换过程中

swapCard(player1.hand[s], player2.hand[t]);

2)在玩家1的手牌和牌组之间交换牌的过程中

swapCard(player1.hand[s], player1.deck[rand]);

在C++中,我们只需要在参数前加一个符号就可以了(我们称THIS为引用传递)。但在 AS3 中,cardA 和 cardB 只是指向形参的指针。在函数中,更改指针不会对形式参数做任何事情:(

我已经搜索了几个小时,但在不知道卡片的所有属性的情况下找不到方法。

如果我必须一张一张地更改卡片的属性,那么也许我应该将 swapCard 更改为 Cards 类中的静态函数? (因为我不想将所有内容都暴露给另一个类(class))我也不确定这是否是一个好习惯。这就像在 Cars 类中添加一个 swap_cars 函数。如果我让这一切发生,接下来会发生什么?洗车、借车、租车……我真的很想保持 Cards 类的清洁,只保留卡片的详细信息。是否有可能在 AS3 中正确执行此操作?

最佳答案

您尝试实现的那种swap 函数在AS3 中是不可能的。输入参数是对输入对象的引用,但引用本身是按值传递的。这意味着您可以在函数内部更改 cardAcardB 但这些更改在函数外部不可见。

编辑:我在您使用示例用法编辑问题后添加了这部分。

您似乎在尝试在每个给定的数组位置处交换 2 个不同数组中的两个对象 - 您可以在 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;
}

请注意,您仍然交换引用并且数组本身仍然通过引用传递(并且数组引用通过值传递 - 如果您愿意,您可以在此函数内将数组更改为新数组,但您不会看到外面的新阵列)。但是,由于数组参数在函数内外引用相同的数组,您可以更改数组的内容(或其他数组属性)以及这些更改在外面可见。

这个解决方案比克隆卡片更快,因为它涉及为新的 Card 实例分配内存(这是昂贵的)并且该临时实例也必须由垃圾收集器释放(这是也很贵)。

您在评论中提到您将卡片向下传递到较低级别的代码 - 如果您没有对数组(和卡片位置)的反向引用,您将无法轻松交换卡片 -在 AS3 中,所有输入参数都是副本(原始类型的值的副本或复杂对象的引用的副本 - 函数中输入参数的更改在外部不可见)。

关于actionscript-3 - AS3 : how to pass by "object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32595190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com