不确定做这个挑战的最佳方法,所以我想再发一次。

我目前的主要问题是,我正在尝试创建一个系统,其中用with语句检查一个变量的值,该变量存储的是某个特定对象类型的所有实例,或者这些实例的一个选定集合。

以下是我目前对代码的想法:

function createRule(_ruleName="unique_path", _affectedPacketNumbers=[]){
    // 如果_affectedPacketNumbers要设置具体值,它会是一个存储受影响数据包编号的数组,第一个数据包从1开始。

    // 在数组和obj_packet之间切换作为起始集合,试图让错误代码获取默认值
    var _affectedPackets = []

    try{
        //_affectedPackets = {}
        array_foreach(_affectedPacketNumbers, function(_packetNum, _index){
            struct_set(_affectedPackets, _index, instance_find(obj_packet, abs(_packetNum)-1))
            array_insert(_affectedPackets, array_length(_affectedPackets), instance_find(obj_packet, abs(_packetNum)-1))
            // 因为数据包不从0开始,instance_find查找的是数据包编号减1的索引
        })
    } catch(error){
        // 这里尝试了catch,因为我觉得空数组会导致array_foreach报错
        // 旧代码正在使用,需要被替换
        _affectedPackets = obj_packet
    }

    array_insert(obj_rules_lawyer.level_rules, array_length(obj_rules_lawyer.level_rules),
    {
        ruleName : _ruleName,
        affectedPacketNumbers : _affectedPacketNumbers,
        affectedPackets : _affectedPackets,
        // 判断该特定规则是否被违反的布尔值
        ruleFulfilled : true
    })
}

之后这段代码执行完,每个与数据包对象相关的规则将使用:
with(obj_rules_lawyer.level_rules[forLoopIndex].affectedPackets) 来获取受此规则影响的数据包的ID。

现在我不知道把所有with语句重写成其他形式是否更好,但如果能用一个with语句来处理所有数据包或选定的数据包集合,那将会非常有帮助。:)