복붙노트

[SCALA] 스칼라 : 스칼라 컬렉션에 이동과의 Iterable 특성의 차이점은 무엇입니까?

SCALA

스칼라 : 스칼라 컬렉션에 이동과의 Iterable 특성의 차이점은 무엇입니까?

이 질문에 보았다 그러나 아직도의 Iterable과에 이동 특성의 차이를 이해하지 않습니다. 누군가가 설명 할 수 있습니까?

해결법

  1. ==============================

    1.간단히 말해, 반복자는 상태를 유지, traversables하지 않습니다.

    간단히 말해, 반복자는 상태를 유지, traversables하지 않습니다.

    foreach 문 :에 이동은 하나 개의 추상 메소드가 있습니다. 당신은 foreach 문을 호출 할 때 컬렉션 전달 기능을 그것을 유지하는 모든 요소를 ​​하나씩 공급됩니다.

    한편,의 Iterable는 반복자를 돌려줍니다 추상적 인 방법 반복자로있다. 당신은 당신의 선택의 시점에서 다음의 요소를 얻기 위해 반복자에 다음 호출 할 수 있습니다. 당신이 할 때까지, 그것이 컬렉션에 어디를 추적 할 수 있으며, 다음은 뭐지.

  2. ==============================

    2.취입 흡입 차이로 생각.

    취입 흡입 차이로 생각.

    당신이 Traversables foreach는, 또는 그 파생 메소드를 호출이있을 때, 그것은 한 번에 함수의 하나에 해당 값을 날려 버릴 것입니다 - 그것은 반복 제어 할 수 있도록.

    반복자가의 Iterable 생각에 의해 반환, 당신은 다음 하나 자신에게 이동할 때 제어, 그것의 값을 빨아.

  3. ==============================

    3.TL; DR의 반복 가능 객체는 상태 반복자 생산할 수 Traversables은

    TL; DR의 반복 가능 객체는 상태 반복자 생산할 수 Traversables은

    첫째,의 Iterable에 이동의 subtrait 것을 알고있다.

    둘째,

    예를 들어, 횡단 (traverse) 대해 찾아의 구현 (이해하는 비아)의 foreach를 사용하여 만족스러운 요소가 발견 된 후 정지의 반복에 BreakControl 예외가 발생.

    trait TravserableLike {
      def find(p: A => Boolean): Option[A] = {
        var result: Option[A] = None
        breakable {
          for (x <- this)
            if (p(x)) { result = Some(x); break }
        }
        result
      }
    }
    

    반면, Iterable을 빼기는이 구현을 무시하고 호출 요소가 발견되면 단순히 반복을 중지 반복자에 찾을 수 있습니다 :

    trait Iterable {
      override /*TraversableLike*/ def find(p: A => Boolean): Option[A] =
        iterator.find(p)
    }
    
    trait Iterator {
      def find(p: A => Boolean): Option[A] = {
        var res: Option[A] = None
          while (res.isEmpty && hasNext) {
            val e = next()
            if (p(e)) res = Some(e)
          }
        res
      }
    }
    

    에 이동 반복에 대한 예외를 발생하지 않는 좋은 것, 그러나 다만 foreach는 사용할 때 부분적으로 반복 할 수있는 유일한 방법입니다.

    쉽게 반복자를 사용하여 foreach는 구현할 수 있지만, 당신이 정말로 foreach 문을 사용하여 반복자를 구현할 수있는 하나 개의 관점에서의 Iterable, 더 까다로운 / 강력한 특징이다.

    요약하면, Iterable을 일시 중지, 재개, 또는 상태 반복자를 통해 반복을 중지 할 수있는 방법을 제공합니다. 에 이동, 그것은 모 아니면도 (흐름 제어 산세 예외)입니다.

    대부분의 시간은 중요하지 않습니다, 당신은 더 일반적인 인터페이스를 할 것입니다. 당신이 이제까지 반복을 통해 더 많은 사용자 정의 제어를 필요로하는 경우, 당신은 당신이의 Iterable에서 검색 할 수있는 반복자를해야합니다.

  4. ==============================

    4.다니엘의 대답은 좋은 소리. 내 자신의 단어에 넣어 내가 할 수있는 경우에 저 보자.

    다니엘의 대답은 좋은 소리. 내 자신의 단어에 넣어 내가 할 수있는 경우에 저 보자.

    반복 가능 당신에게 한 번에 요소 하나를 통과 할 수 있도록하는 반복자를 제공 할 수 있도록하고, 정지 (다음 ()를 사용)과 같이하십시오 이동합니다. 반복자의 필요 요소의 위치로 내부 "포인터"를 유지하기 위해 그렇게합니다. 그러나에 이동 당신에게 중지하지 않고 한 번에 모든 요소를 ​​통과하는 방법, foreach 문을 제공합니다.

    범위 (1, 10)와 같은 뭔가가에 이동과 같은 상태로 단지 2 개의 정수를 가질 필요가있다. 그러나 반복 가능 등의 범위 (1, 10) 당신에게 인덱스 중 하나의 상태에 대해 3 개 정수를 사용할 필요가 반복자를 제공합니다.

    에 이동도 foldLeft이 foldRight, 그 foreach는 알려진 고정 된 순서로 요소를 탐색 할 필요가 있습니다 것을 고려. 따라서 그것은에 이동에 대한 반복자를 구현하는 것이 가능하다. 예를 들면     DEF 반복자 = toList.iterator

  5. from https://stackoverflow.com/questions/7425370/scala-what-is-the-difference-between-traversable-and-iterable-traits-in-scala-c by cc-by-sa and MIT license