【问题标题】:How to use Vector with offset from parent Haxe class instance?如何使用 Vector 与父 Haxe 类实例的偏移量?
【发布时间】:2017-07-12 10:45:17
【问题描述】:

有哪些方法可以实现从另一个类访问父实例Vector cell?

我的问题是关于用“??”注释的行:

class Test {
    static function main() {
        var a:A = new A();
        var b:B = new B(a, 115);
    }
}

class A {
    public var cells:haxe.ds.Vector<Float>;

    public function new() {
        cells = new haxe.ds.Vector(1000);
    }
}

class B {
    public var a:A; // the "parent"
    public var my_offset:Int;
    public var my_cells:haxe.ds.Vector<Float>; //??

    public function new(a:A, offset:Int) {
        my_offset = offset;
        my_cells[2] = 0.5; //?? actually a.cells[my_offset + 2];
    }

}

是否可以:

  • 直接访问父 Vector 内存?
  • 使用宏?
  • 使用摘要?

"Try Haxe" link

【问题讨论】:

  • 刚刚又一次偶然发现了这个老问题。我的回答是否回答了它,还是还有什么不清楚的地方? :)

标签: arrays haxe


【解决方案1】:

您可以创建一个包装Vectorabstract 类型,通过定义@:arrayAccess() methods 自动添加所需的偏移量:

class Main {
    static function main() {
        var cells = new haxe.ds.Vector(1000);
        cells[115] = 1.5;

        var cellsWithOffset = new VectorWithOffset(cells, 115);
        trace(cellsWithOffset[0]); // 1.5
    }
}

abstract VectorWithOffset<T>(VectorWithOffsetData<T>) {
    public function new(vector:haxe.ds.Vector<T>, offset:Int) {
        this = {vector: vector, offset: offset};
    }

    @:arrayAccess inline function get(i:Int):T {
        return this.vector[i + this.offset];
    }

    @:arrayAccess inline function set(i:Int, v:T):T {
        return this.vector[i + this.offset] = v;
    }
}

typedef VectorWithOffsetData<T> = {
    var vector:haxe.ds.Vector<T>;
    var offset:Int;
}

注意:抽象不一定要包装一个结构,它也可以是一个类。但是你不能直接包装 Vector,因为 offset 需要存储在某个地方,并且摘要不能有自己的成员变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多