Monkey/语言/列表
外观
在 Monkey 中,列表是一组封装在一个对象中的对象,并按顺序读取。列表可以向前、向后读取,逐个对象遍历,排序,并提供节点级访问以进行插入和查询。
示例
Class Obj
Field x:Int, y:Int, z:Int
Method New(xx:Int,yy:Int,zz:Int)
x=xx; y=yy; z=zz
End
End
Function Main()
mylist = New List<Obj>
mylist.AddLast(New Obj(1,1,1))
mylist.AddLast(New Obj(2,2,2))
mylist.AddFirst(New Obj(3,3,3))
Print "list:"
For Local o:Obj = Eachin mylist
Print o.x+" "+o.y+" "+o.z
Next
End
列表与其他对象一样,使用 'NEW' 关键字创建。它与其他对象的不同之处在于它需要一个类型说明符。类型说明符(或类型参数)使用大于和小于符号定义:< 和 >。在上面的示例中,列表 'mylist' 是 'Obj' 的列表,它是一个包含三个字段的类:x、y 和 z。
'EachIn' 将自动遍历列表,将对象分配给迭代变量。当遇到 NULL 时,EachIn 将退出循环,表示列表的结尾。
列表节点语法
Local mynode:list.Node<Obj>
mynode = mylist.FirstNode()
当对象添加到列表时,也会创建节点
Local mynode:list.Node<Obj> = mylist.AddLast(New Obj(4,4,4))
节点可以从列表中返回一个值
Local o:Obj = mynode.Value()
Print o.x+" "+o.y+" "+o.z
节点可以用来反向遍历列表
Local mynode:list.Node<Obj> = mylist.LastNode()
While mynode
Local o:Obj
o = mynode.Value()
Print o.x+" "+o.y+" "+o.z
mynode = mynode.PrevNode()
Wend
节点可以使用节点构造函数(New 命令)将值插入列表中
Local mynode:list.Node<Obj> = mylist.FirstNode()
Local insertdata:Obj = New Obj(9,9,9)
While mynode
If mynode.Value.x = 2
''insert after
New list.Node<Obj>( mynode.NextNode(), mynode, insertdata)
Endif
mynode = mynode.NextNode()
Wend
节点可以从列表中删除一个值,但请确保在删除节点之前已完成该节点的操作
Local mynode:list.Node<Obj> = mylist.FirstNode()
Local removenode:list.Node<Obj>
While mynode
If mynode.Value.x = 2
''remove
removenode = mynode
Endif
mynode = mynode.NextNode()
removenode.Remove()
Wend