2009-11-18 3 views
1

각 : 보자 (코드 연속이 수집/선택/거부/I가 배열 놀러와 루비에 꽤 많이 해시 및 다음과 같습니다 몇 가지 코드로 끝날

sum = two_dimensional_array.select{|i| 
    i.collect{|j| 
    j.to_i 
    }.sum > 5 
}.collect{|i| 
    i.collect{|j| 
    j ** 2 
    }.average 
}.sum 

의 모두가 척 위의 코드 예제는 이제 의미가 있습니다.) 문제는 TextMate (내 편집자)가 단순한 {...} 또는 블록을 매우 쉽게 집어 들었지만 문제가되는 것은 알 수 없습니다. 위의 블록이 시작하고 끝나는 곳에 "올바른"폴드 방법을 찾을 수 없습니다.

위의 코드 샘플을 어떻게 접을 수 있습니까?

PS : 그것은 접는의 2 개 수준을 가질 수있는, 난 단지,

답변

1

솔직히하려면 외부 연속 사람 (의 I와 블록)에 대해 아마 누군가만큼의 TextMate를 혼란 뒤얽힌 뭔가를 걱정 고려 다른 사람은 그것을 유지해야하고, 그것은 당신을 미래에 포함시킵니다.

단일 값으로 롤업되는 것을 볼 때마다 Enumerable # inject를 사용하는 것이 좋습니다. 귀하의 예제에서 이상한 당신이 to_i를 사용하여 변환 혐의로, 전체 배열을 반환하는 선택 사용하고 있지만 사실 Enumerable에서 # 선택 무엇

sum = two_dimensional_array.inject(0) do |sum, row| 
    # Convert row to Fixnum equivalent 
    row_i = row.collect { |i| i.to_i } 

    if (row_i.sum > 5) 
    sum += row_i.collect { |i| i ** 2 }.average 
    end 

    sum # Carry through to next inject call 
end 

는 그런 일을하지 않고, 대신에 기능이 전무를 반환하는 어떤을 거부 . 나는 그것이 당신의 가치가 아니라고 추정하고 있습니다.

또한 .average 메서드가 구현되는 방법에 따라 부동 소수점 값을 사용하기 위해 inject 대신 0을 사용하여 0.0을 시드 할 수 있습니다.

+0

내가 게시 한 코드는 실제로 그것을 조사하지 않고 쓴 것일 뿐이므로 작성한 코드의 대략적인 모양을주고 싶었습니다 (/ 나를 선택 -> 수집). 나는 주사를 살펴보고 그것이 단순화하는데 도움이되는지를 조사 할 것이다. – Kostas