AS3 中重载 [] 运算符

发布于 2024-07-12 01:18:32 字数 186 浏览 7 评论 0原文

我刚刚编写完自己的集合类,我真的很想让它可以使用 foreach 或简单的 for 构造进行迭代,或者只是使用 collection[key] 表示法来访问元素。

我写了一个 getElementAt(index):MyOwnElement 函数,但是使用它并不像使用方括号那么性感,甚至不让我开始迭代..

有什么办法吗?

I just finished writing my own collecion class, and i'd really like to make it iterable with the for each or the simple for construct, or just to access elements with the collection[key] notation.

I've written a getElementAt(index):MyOwnElement function, but using it, is not as sexy as using the square brachets, don't even let me start on iterating..

Is there any way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

岁月打碎记忆 2024-07-19 01:18:33

您不能覆盖 AS3 中的运算符。
我认为您可以将“getElementAt”更改为“at”之类的短名称:)
或将 getElementAt 分配给临时变量......

You can not override operator in AS3.
I think you may change 'getElementAt' to a short name likes 'at':)
or assgin getElementAt to a temp variable....

眼藏柔 2024-07-19 01:18:33

取决于您的集合的内部结构。 如果您的集合存储为数组,那么您可以使用属性来实现方括号效果:


/*** MyCollection class ***/
private var elementHolder : Array;

public function get getElementAt() : Array{
   return elementHolder;
}
/*** Some other class******/
public function main() : void{
   trace("Element at 3: " + myCollection.getElementAt[3] );
}

如果您的集合不是存储在数组中,也许您可​​以将其转换为数组(如 java Collection 的 toArray() 方法)。

例如,如果您的集合是一个链接列表:


/*** MyCollection class ***/

public function get getElementAt() : Array{
   var temp : Array = new Array();
   while( node.next != null{
      temp.push( node );
   }
   return temp;
}
/*** Some other class******/
public function main() : void{
   trace("Element at 3: " + myCollection.getElementAt[3] );
}

Depends on the internal structure of your collection. If your collection is stored as an Array then you can use properities to achieve a square bracket effect:


/*** MyCollection class ***/
private var elementHolder : Array;

public function get getElementAt() : Array{
   return elementHolder;
}
/*** Some other class******/
public function main() : void{
   trace("Element at 3: " + myCollection.getElementAt[3] );
}

If your collection is not stored in an array maybe you can convert it to an array (like the java Collection's toArray() method).

for example, if your collection is a linked list:


/*** MyCollection class ***/

public function get getElementAt() : Array{
   var temp : Array = new Array();
   while( node.next != null{
      temp.push( node );
   }
   return temp;
}
/*** Some other class******/
public function main() : void{
   trace("Element at 3: " + myCollection.getElementAt[3] );
}
城歌 2024-07-19 01:18:32

您应该查看 mx.utils.Proxy< /code>- 从中​​子类化您的集合类(并将其设置为动态)可能会让您访问您想要的一些功能(或者至少是足够接近的功能)。

例如,这里是摘录nextValue() 方法的文档:

“允许枚举代理
对象的属性通过索引号来
检索属性值。 然而,你
无法枚举属性
代理类本身。 此功能
支持实现 for...infor
every..in
在对象上循环
检索所需的值。”

You should take a look at mx.utils.Proxy -- subclassing your collection class from that (and setting it as dynamic) might give you access to some of the functionality you want (or at least something that's close enough.)

For example, here's an excerpt from the documentation of the nextValue() method:

"Allows enumeration of the proxied
object's properties by index number to
retrieve property values. However, you
cannot enumerate the properties of the
Proxy class themselves. This function
supports implementing for...in and for
each..in
loops on the object to
retrieve the desired values."

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文