我编写了以下(非常简单的)环形缓冲区类,它应该允许通过 @: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。
答案 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
所示。