休息参数问题

Rest parameter problems

我正在尝试让 class 从父 class 继承剩余参数。不幸的是,由于某种原因,继承的剩余参数的输入被视为一个完整的索引,而不是每个索引都像它自己的索引一样。

这是父级 class 的代码,其中包含一个正常工作的剩余参数:

package {
    import flash.events.MouseEvent;
    import flash.display.Stage;

public class SubClassText extends ClassText {
    protected var parentText:ClassText;
    protected var setStatValues;
    protected var className:String;
    protected var classType:int;

    public function SubClassText(textKey:String, textName:String, stageInstance:Stage, isVisible:Boolean, alignToObject:Object, direction:String, xDistance:Number, yDistance:Number, onOverText:String, parentText:ClassText, className:String, classType:int, ... setStatValues) {
        super(textKey, textName, stageInstance, isVisible, alignToObject, direction, xDistance, yDistance, onOverText);
        this.parentText = parentText;
        this.parentText.subClassArray.push(this);
        this.setStatValues = setStatValues;
        this.className = className;
        this.classType = classType;
    }

    //Called when the player clicks this object
    override protected function onClick(e:MouseEvent) {
        trace(this.setStatValues.length);
        Entity.getEntity("entityName", "player").setStat("className", this.className);
        Entity.getEntity("entityName", "player").setStat("classType", this.classType);

        for(var i:int = 0; i < this.setStatValues.length; i++) {
            Entity.getEntity("entityName", "player").setStat(Main.statArray[i], this.setStatValues[i]);
        }
        Main.setClassVisibility(this.parentText.subClassArray, true);
    }

    //Adds this object to it's parent's class array
    override protected function addToArray() {
        Main.subClasses.push(this);
    }
}
}

我在 onClick 侦听器中调用 trace() 来查看剩余参数的长度。在这个 class 的所有实例中,其余参数 returns 适当数量的输入(在这种情况下,5 因为这是一个实体有多少统计数据)。

这是扩展此父级 class 的 class:

package {
import flash.events.MouseEvent;
import flash.display.Stage;

public class AllySubClassText extends SubClassText {
    private var displayName:String;

    public function AllySubClassText(textKey:String, textName:String, stageInstance:Stage, isVisible:Boolean, alignToObject:Object, direction:String, xDistance:Number, yDistance:Number, onOverText:String, parentText:ClassText, displayName:String, className:String, classType:int, ... setStatValues) {
        super(textKey, textName, stageInstance, isVisible, alignToObject, direction, xDistance, yDistance, onOverText, parentText, className, classType, setStatValues);
        this.displayName = displayName;
    }

    //Called when the player clicks this object
    override protected function onClick(e:MouseEvent) {
        trace(this.setStatValues.length);
        Main.tryAddAlly(this.displayName, this.className, this.classType, this.setStatValues);
        Main.setAllyVisibility(this.parentText.subClassArray, true);
    }

    //Adds this object to it's parent's class array
    override protected function addToArray() {
        Main.allySubClasses.push(this);
    }
}
}

如您所见,我有相同的剩余参数和相同的 trace() 调用。

为了更好地理解,这里有一个 SubClassText 实例的示例片段:

var beserker:SubClassText = new SubClassText("beserker", "Beserker", stage, false,
warrior, "downCenter", 0, 0, "Beserkers are crazy strong fighters", warrior, "Beserker", 
0, 15, 5, 10, 10, 10);

然后我可以进入那个 SubClassText 并跟踪它的其余参数长度(setStatValues,我将从 fla 文档中跟踪它,所以现在我将制作该参数 public 而不是protected):

trace(beserker.setStatValues.length); //5

下面是 AllySubClassText 实例的示例:

var knight:AllySubClassText = new AllySubClassText("knight", "War: The Knight", 
stage, false, warriors, "downCenter", 0, 0, "War is a strong Knight", warriors, "War",
"Knight", 0, 15, 5, 10, 10, 10);

然后当我跟踪骑士实例的剩余参数长度时:

trace(knight.setStatValues.length); //1

示例片段直接取自我的代码,我只是缩短了 onHover 字符串以便于阅读。很抱歉 classes 上的大量输入,UI 代码很快需要大量参数才能正常工作。我不确定为什么所有输入都被视为一个索引而不是单独的索引。我什至知道它正在这样做,因为这是我仅跟踪其余参数时发生的情况:

trace(knight.setStatValues + ", " + knight.setStatValues.length); //15,5,10,10,10, 1

如有任何帮助,我们将不胜感激。这可能是一个小疏忽,但我现在很困惑。

问题是 ...rest 参数是一个数组。 这意味着当您将该数组作为 ...rest 参数传递给另一个函数时,它将长度为 1,因为您只传递了一个参数:单个数组。

它不会自动 "unwrap" 一个数组到它的元素中。

试试这个:

function first(...firstRest):void
{
    trace(firstRest.length);
    second(firstRest);
}

function second(...secondRest):void
{
    trace(secondRest.length);
}

first(1,2,3);

无论如何我都不推荐使用...rest。 创建一个包含所有状态变量的 class 并将该 class 的对象传递给构造函数。这允许您对值进行边界检查,分派更改事件以更新显示统计信息的视图等。

您在此处显示的这些构造函数调用看起来非常臃肿。 传递配置对象将有助于减少混乱。