什么是这个python迭代器的等价物的kotlin成语

问题是,如何在Kotlin中创建一个像Python一样的迭代器。

考虑这个将字符串解析为子字符串的Python代码:

def parse(strng, idx=1): lst = [] for i, c in itermarks(strng, idx): if c == '}': lst.append(strng[idx:i-1]) break elif c == '{': sublst, idx = parse(strng, i+1) lst.append(sublst) else: lst.append(strng[idx:i-1]) idx = i+1 return lst, i >>>res,resl = parse('{ a=50 , b=75 , { e=70, f=80 } }') >>>print(resl) >>>[' a=50', ' b=75', [' e=7', ' f=80'], '', ' f=80'] 

这是一个演示例子,只是为了说明一个python迭代器:

 def findany(strng, idx, chars): """ to emulate 'findany' in kotlin """ while idx < len(strng) and strng[idx] not in chars: idx += 1 return idx def itermarks(strng, idx=0): while True: idx = findany(strng, idx, ',{}"') if idx >= len(strng): break yield idx, strng[idx] if strng[idx] == '}': break idx += 1 

Kotlin有迭代器和生成器,据我了解,每个类型只能有一个。 我的想法是定义一个类型的发电机和实例类型。 所以从'parse'(上面)的for循环看起来像这样:

for((i,c)in IterMarks(strng){……}

但是,我怎么定义生成器,什么是最好的成语。

Kotlin使用两个接口: Iterable<T> (来自JDK)和Sequence<T> 。 它们是相同的,除了第一个是急切的,而第二个是惯例懒惰的。

要使用迭代器或序列,你所要做的就是实现其中一个接口。 Kotlin stdlib有一堆帮助函数可能会有所帮助。

特别是在1.1中增加了一些用于创建具有yield序列的函数。 他们和其他一些功能被称为generators 。 如果你喜欢,可以使用它们,或手动实现接口。

好,经过一番工作,这里是迭代器的Kotlin:

 import kotlin.coroutines.experimental.* fun iterMarks(strng: String, idx:Int=0)=buildSequence{ val specials = listOf("\"", "{", "}", ",") var found:Pair<Int,String>? var index = idx while (true){ found = strng.findAnyOf(specials, index) if (found == null) break yield (found) index= found.first + 1 } } 

主要的发现是任何函数都可以返回一个迭代器,因此不需要将迭代器方法添加到现有对象中。 JetBrains doco是坚实的,但缺乏例子,所以希望上面的例子有所帮助。 你也可以从基础工作,再次说明是好的,但没有例子。 如果有兴趣的话,我会在其他方面发表更多。

这个代码“解析”然后工作:

 fun parse(strng:String, idxIn:Int=1): Pair<Any,Int> { var lst:MutableList<Any> = mutableListOf() var idx = idxIn loop@ for (mark in iterMarks(strng, idx)){ if(mark==null ||mark.first <= idx){ // nothing needed } else { when( mark.second ) { "}" -> { lst.add(strng.slice(idx..mark.first - 1)) idx = mark.first + 1 break@loop } "{" -> { val res: Pair<Any, Int> res = parse(strng, mark.first + 1) lst.add(res.first) idx = res.second } "," -> { lst.add(strng.slice(idx..mark.first - 1)) idx = mark.first + 1 } } } } return Pair(lst, idx) } 

希望通过提供一个实现迭代器的例子,这个例子将使下一个新的Kotlin人员减少工作量。 具体来说,如果你知道如何在Python中创建一个迭代器,那么这个例子应该是有用的