2017-11-07 1 views
-1

루비에는 반복을 통해 직접 결과를 반환하는 좋은 방법이 많이 있습니다. 이것은 주로 배열 메소드를 포함합니다. 예를 들어 :while 루프를 사용하여 Ruby 배열을 만드는 가장 깨끗한 방법은 무엇입니까?

def ten_times_tables 
    (1..5).map { |i| i * 10 } 
end 

ten_times_tables # => [10, 20, 30, 40, 50] 

그러나, 가끔 while를 사용하여 반복하고 직접 결과 배열을 반환합니다. 예를 들어, 배열의 내용은 예상 최종 값 또는 일부 누산기 또는 제어 외부의 조건에 따라 달라질 수 있습니다. , 접근의이 종류가 꽤 느낌 "유엔 - 루비"나에게

def fibonacci_up_to(max_number) 
    sequence = [1, 1] 

    while sequence.last < max_number 
    sequence << sequence[-2..-1].reduce(:+) 
    end 

    sequence 
end 

fibonacci_up_to(5) # => [1, 1, 2, 3, 5] 

: 같은

A (인위적인) 예 보일 수 있습니다. 배열을 만들고 이름을 지정하고 나중에 배열을 반환한다는 사실은 반 패턴처럼 느껴집니다. 지금까지 최고의 내가 tap을 사용하고 가지고 올 수 있지만, 그것은 여전히 ​​매우 구역질 (아주 중첩) 느낌 :

def fibonacci_up_to(max_number) 
    [1, 1].tap do |sequence| 
    while sequence.last < max_number 
     sequence << sequence[-2..-1].reduce(:+) 
    end 
    end 
end 

다른 사람이 문제가 이런 종류의 어떤 영리 솔루션이 있습니까? 워드 프로세서

을 : 당신의 인위적인 예제가되도록 (어쩌면 당신의 인위적인 예는 실제 사용 사례에 비해이 훨씬 더 적합하지만)이 같은 상황을 조사 할 수 있습니다

+0

귀하의 인위적인 시나리오입니다. 따라서 결과를 얻기위한 코드는 약간 특이한 것처럼 보입니다. 그러나 나는 당신의 원래 접근법이나 그것을 개선하기위한 중요한 방법에 특히 잘못된 것을 보지 못합니다. –

답변

5

뭔가, Enumerator을 만드는 초기화를 위해 :

fib = Enumerator.new do |y| 
    a = b = 1 
    loop do 
    y << a 
    a, b = b, a + b 
    end 
end 
다음은 전화 :

p fib.take_while { |elem| elem <= 5 } 
#=> [1, 1, 2, 3, 5] 

그래서, 당신은에

0

유사 보통 루비 틱 방법으로 배열에 대한 값을 모든 값을 반복 처리하고 있음을 일단 다음, 당신은 그것을 통해 반복 할 수있는 열거를 생성하고 수집 간단한 라임의 열거 솔루션은, 당신은 열거 자체를 래핑하는 방법을 쓸 수 있습니다 :

def fibonacci_up_to(max_number) 
    return enum_for(__callee__, max_number) unless block_given? 

    a = b = 1 
    while a <= max_number 
    yield a 
    a, b = b, a + b 
    end 
end 

fibonacci_up_to(5).to_a # => [1, 1, 2, 3, 5] 

이 방법에서 열거 인스턴스를 반환과 같은 결과를 얻을 수 있지만, 조금 더 멋진 외모와 당신이 yield을 사용할 수 있습니다 키워드 대신 yielder 블록 변수를 사용하십시오. 그것은 또한 당신이 좋아하는 깔끔한 일을 할 수 있습니다 : 당신은 매우 특별한, 말한대로

fibonacci_up_to(5) do |i| 
    # .. 
end 
관련 문제