[SCALA] 스칼라 : 스칼라 컬렉션에 이동과의 Iterable 특성의 차이점은 무엇입니까?
SCALA스칼라 : 스칼라 컬렉션에 이동과의 Iterable 특성의 차이점은 무엇입니까?
이 질문에 보았다 그러나 아직도의 Iterable과에 이동 특성의 차이를 이해하지 않습니다. 누군가가 설명 할 수 있습니까?
해결법
-
==============================
1.간단히 말해, 반복자는 상태를 유지, traversables하지 않습니다.
간단히 말해, 반복자는 상태를 유지, traversables하지 않습니다.
foreach 문 :에 이동은 하나 개의 추상 메소드가 있습니다. 당신은 foreach 문을 호출 할 때 컬렉션 전달 기능을 그것을 유지하는 모든 요소를 하나씩 공급됩니다.
한편,의 Iterable는 반복자를 돌려줍니다 추상적 인 방법 반복자로있다. 당신은 당신의 선택의 시점에서 다음의 요소를 얻기 위해 반복자에 다음 호출 할 수 있습니다. 당신이 할 때까지, 그것이 컬렉션에 어디를 추적 할 수 있으며, 다음은 뭐지.
-
==============================
2.취입 흡입 차이로 생각.
취입 흡입 차이로 생각.
당신이 Traversables foreach는, 또는 그 파생 메소드를 호출이있을 때, 그것은 한 번에 함수의 하나에 해당 값을 날려 버릴 것입니다 - 그것은 반복 제어 할 수 있도록.
반복자가의 Iterable 생각에 의해 반환, 당신은 다음 하나 자신에게 이동할 때 제어, 그것의 값을 빨아.
-
==============================
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.다니엘의 대답은 좋은 소리. 내 자신의 단어에 넣어 내가 할 수있는 경우에 저 보자.
다니엘의 대답은 좋은 소리. 내 자신의 단어에 넣어 내가 할 수있는 경우에 저 보자.
반복 가능 당신에게 한 번에 요소 하나를 통과 할 수 있도록하는 반복자를 제공 할 수 있도록하고, 정지 (다음 ()를 사용)과 같이하십시오 이동합니다. 반복자의 필요 요소의 위치로 내부 "포인터"를 유지하기 위해 그렇게합니다. 그러나에 이동 당신에게 중지하지 않고 한 번에 모든 요소를 통과하는 방법, foreach 문을 제공합니다.
범위 (1, 10)와 같은 뭔가가에 이동과 같은 상태로 단지 2 개의 정수를 가질 필요가있다. 그러나 반복 가능 등의 범위 (1, 10) 당신에게 인덱스 중 하나의 상태에 대해 3 개 정수를 사용할 필요가 반복자를 제공합니다.
에 이동도 foldLeft이 foldRight, 그 foreach는 알려진 고정 된 순서로 요소를 탐색 할 필요가 있습니다 것을 고려. 따라서 그것은에 이동에 대한 반복자를 구현하는 것이 가능하다. 예를 들면 DEF 반복자 = toList.iterator
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
'SCALA' 카테고리의 다른 글
[SCALA] 주장을 테스트하는 것은 무엇인가 컴파일되지해야 (0) | 2019.11.18 |
---|---|
[SCALA] 스칼라 2.8 및 스칼라 2.7 사이의 가장 큰 차이점은 무엇입니까? (0) | 2019.11.18 |
[SCALA] 어떻게 액세스 테스트 리소스에? (0) | 2019.11.18 |
[SCALA] Scala.React의 상태는 무엇입니까? [닫은] (0) | 2019.11.18 |
[SCALA] 명확한 설명은 스칼라에서 선물과 약속에 대한 필요 (0) | 2019.11.18 |