편집 지금 질문을 이해합니다.
y << a
은 y.yield(a)
의 별명이며 기본적으로는 반환 값이 sleep
입니다. 숫자가 next
으로 열거 자에서 요청 될 때마다 다른 값이 산출 될 때까지 실행이 계속됩니다.
열거 자 요소의 유한 수를 열거 할 필요가 없습니다, 그래서 그들은 무한이다. 예를 들어, fib.to_a
은 무한 개수의 요소가있는 배열을 작성하려고하기 때문에 절대로 종료되지 않습니다.
이와 같이 열거자는 자연수 또는 사용자의 경우 피보나치 수와 같은 무한 시리즈의 표현으로 유용합니다. 열거 자의 사용자는 필요한 값의 수를 결정할 수 있습니다. 예를 들어 take(10)
은 사용자가 원하는 경우 중단 조건을 결정합니다.
중단 조건 자체는 구현시 Enumerator#take
입니다. 데모 목적을 위해, 우리는 우리 자신의 구현이 my_take
라고 할 수 있습니다 :
class Enumerator
def my_take(n)
result = []
n.times do
result << self.next
end
result
end
end
어디 당신의 고전적인 C 스타일 for (i=0; i<n; i++)
와 "물론 정신적으로 대체"당신의 n.times
루프 수 있습니다. 휴식 조건이 있습니다. 당신은 물론 값의 유한 수를 열거하는 열거를 구축 할 수
말했다
fib.next
#=> 1
fib.next
#=> 1
fib.next
#=> 2
fib.next
#=> 3
, 같은 : self.next
당신은 또한 클래스의 외부에서 사용할 수있는 열거의 다음 값을 얻을 수있는 방법이다 주어진 범위의 자연수입니다.하지만 여기서는 그렇지 않습니다. 그런 다음 next
을 호출하려고하면 열거자는 StopIteration
오류를 발생 시키지만 모든 값은 이미 열거되었습니다. 이 경우 두 가지 조건이 있습니다. 그러면 이전에 깨지던 것이 승리 할 것입니다. take
실제로 오류에서 구출하여 그 처리, 그래서 다음 코드는 조금 더 실제 구현 (그러나, take
실제로 C에서 구현)입니다.
class Enumerator
def my_take(n)
result = []
n.times do
result << self.next
end
result
rescue StopIteration
# enumerator stopped early
result
end
end
매우 흥미 롭습니다! –