2017-05-20 17 views
0

질문은 Kotlin의 반복자와 같은 Python을 작성하는 방법입니다. 단지 파이썬 반복자 설명하기 위해이 놀이의 예입니다이 python 반복자에 해당하는 kotlin 관용구는 무엇입니까

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'] 

:

는 문자열로 문자열을 구문 분석이 파이썬 코드를 고려

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 

코 틀린는 반복자와 발전기를 가지고, 그리고 내가 이해 그것은 유형 당 하나만있을 수 있습니다. 내 생각은 유형을 생성자와 인스턴스로 정의하는 것입니다. ((I, C) IterMarks에서 (strng) { ...... }

에 대한

을하지만 난 어떻게해야 : 그래서 '구문 분석'에서 루프 (위)과 같을 것이다

답변

0

Kotlin은 Iterable<T> (JDK에서 제공)과 Sequence<T>의 두 인터페이스를 사용하며, 첫 번째 것은 열심이고 두 번째 인터페이스는 규칙에 따라 게으르다는 점만 제외하면 동일합니다.

반복자 또는 시퀀스 작업을 수행하려면해야 할 일은 다음 중 하나를 구현하는 것입니다. ose 인터페이스. Kotlin stdlib에는 도움이 될 수있는 도우미 기능이 많이 있습니다.

특히, yield으로 시퀀스를 만드는 두 가지 기능이 1.1에 추가되었습니다. 이들과 다른 기능은 generators입니다. 원한다면 사용하거나 수동으로 인터페이스를 구현하십시오.

+0

또한 다음 값을 계산하는 초기 값 + 람다를 사용하는 generateSequence도 있습니다. 'null'을 반환하자마자 'Sequence'가 끝납니다. –

0

확인, 몇 일 후, 여기에 반복자의 코 틀린입니다 :

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 
    [email protected] 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 
        [email protected] 
       } 
       "{" -> { 
        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) 

} 

는 희망이 예는 반복자를 구현의 예를 제공함으로써, 코 틀린 새로운 다음 사람을 위해 그것을 적은 작업을 할 것입니다. 특히 파이썬에서 이터레이터를 만드는 방법을 알고 있다면이 예제는 유용 할 것입니다.