2016-06-17 4 views
0

나는 내 머리를 감쌀 수 없다. 나는 ruby-doc on enumerator와 상담하려고했지만 많은 도움이되지 못했습니다. 루비 문서에서enumerator.new에서 무엇을합니까 do | y |

:

fib = Enumerator.new do |y| 
    a = b = 1 
    loop do 
    y << a 
    a, b = b, a + b 
    end 
end 

내가 이해하지, 왜 그냥 fib = Enumerator.new 쓰기,하지만 난 fib = Enumerator.new do |y|를 작성해야 할 수있다?

어떤 종류의 물체가 y입니까? fib.next이 실행될 때 또는 fib.take(5)이 실행될 때 y은 무엇입니까?

답변

0

필자는 fib = Enumerator.new를 쓸 수없는 이유는 무엇입니까?하지만 fib = Enumerator.new do | y |를 써야합니까?

당신이 중 하나를 next 또는 take(5)

y이 열거를 참조하는 로컬 범위 변수는 호출 할 때까지 아무것도를 평가하지 않습니다 열거를 만들었습니다. 본질적으로 블록 do..end의 열거자를 생성하고 열거 자에 자체 논리를 적용하므로 액세스 할 때 원하는 값으로 평가됩니다.

1

사용중인 양식은 값으로 y이 될 수있는 인수로 블록을 허용합니다.

fib.next이 호출되면 y 값은 호출자에게 "yielded"됩니다. 예제에서 볼 수 있듯이 블록은 루프를 호출하고 각 반복마다 값을 계산합니다. 따라서 y은 값을 누적하는 배열입니다.

fib 열거 자에서 take(10)을 호출하면 처음 10 개의 fibonacci 번호가 "산출"됩니다. 다음에 전화하면 열한째를 "내어 줄"다. 이 열거자는 필요하지 않더라도 "무한"것으로 간주 될 수 있습니다.

또 다른 인위적인 예 : 여기

concat = Enumerator.new do |c| 
    cat = "concat" 
    loop do 
     c << cat 
     cat += "concat" 
    end 
end 

p concat.take(5) 

는 열거 반복 "CONCAT"의 문자열을 얻을 수 있습니다. This은 이전 기사이지만 열거자는 열거 가능하므로 take을 호출하여 볼 수있을뿐만 아니라이 클래스의 메서드를 사용할 수 있습니다.

관련 문제