使用@:arrayAccess,但仍然“不允许数组访问”

时间:2016-02-18 14:26:49

标签: haxe

我编写了以下(非常简单的)环形缓冲区类,它应该允许通过 @:arrayAccess 宏进行数组访问:

class RingBuffer<T>
{
    private var _elements : Array<T> = null;

    public function new(p_numElements : Int, p_defaultValue : T)
    {
        _elements = new Array<T>();

        for (i in 0 ... p_numElements)
        {
            _elements.push(p_defaultValue);
        }
    }

    public function add(p_value : T) : Void
    {
        // Remove the first element
        _elements.splice(0, 1);
        _elements.push(p_value);
    }


    @:arrayAccess public inline function get(p_index : Int)
    {
      return _elements[p_index];
    }

    @:arrayAccess public inline function set(p_index : Int, p_value : T)
    {
        _elements[p_index] = p_value;
        return p_value;
    }
}

但是当我尝试在类的实例上使用数组访问时,我收到错误告诉我“不允许对数组访问...”

我在使用宏时做错了什么?我基本上遵循了示例in the manual

1 个答案:

答案 0 :(得分:3)

@:arrayAccess仅允许在摘要(而不是类)上使用,这就是它在Abstracts section of the Haxe manual中的原因。您链接的页面还说明:

  

然而,使用摘要,可以定义自定义数组访问方法。

您可以做的是将您的班级重命名为RingBufferImpl并创建一个名为abstract的{​​{1}}来包装该类型并提供数组访问权限:

RingBuffer

用法:

@:forward
@:access(RingBufferImpl)
abstract RingBuffer<T>(RingBufferImpl<T>) from RingBufferImpl<T>
{
    @:arrayAccess public inline function get(p_index : Int)
    {
      return this._elements[p_index];
    }

    @:arrayAccess public inline function set(p_index : Int, p_value : T)
    {
        this._elements[p_index] = p_value;
        return p_value;
    }
}

请注意,var buffer:RingBuffer<Int> = new RingBufferImpl<Int>(10, 0); buffer[0] = 5; for (i in 0...10) trace(buffer[i]); 不是宏,而是metadata - 具体为built-in compiler metadata,如@:arrayAcess所示。