Skip to content
On this page

凹语言支持for range迭代器


在新发布的 v0.22.0 版本中实验性地引入了for range迭代器支持。比如内置了对整数值迭代的支持:

wa
func main {
	for i := range 3 {
		println(i)
	}
}

本质上这和运算符重载是类似的特性,这里是range运算符内置对整数进行的重载。更有趣的是range运算符还针对可被调用对象进行了重载,这样就可以实现自定义迭代器的能力:

wa
type MyObject :struct {
	elems: []string
}

func New(a: ...string) => *MyObject {
	return &MyObject{elems: a}
}

func MyObject.Iter => func => (ok: bool, k: int, v: string) {
	idx: int
	return func => (ok: bool, k: int, v: string) {
		if ok = idx < len(this.elems); ok {
			k, v = idx, this.elems[idx]
			idx++
		}
		return
	}
}

func main {
	for i, v := range New("aa", "bb", "cc").Iter() {
		println(i, v)
	}
}

其中MyObject类型的Iter方法返回的是一个闭包函数对象:该闭包函数返回ok、key和value三个值,其中ok决定何时迭代终止,后续的2个返回值可以根据需要省略一个。

运行的结果如下:

$ wa run a.out.wa
0 aa
1 bb
2 cc

目前这是一个实验性的特性,未来开发组将根据真实开发场景做调整和完善,也欢迎社区同学参与讨论。