문제

나는 루비에서 배열과 해시를 많이 가지고 놀고 다음과 같은 보이는 코드로 끝납니다.

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

(위의 코드 샘플이 이제 의미가 있다고 가정 해 봅시다 ...)

문제는 TextMate (선택의 편집자)가 간단하게 선택 되더라도 {...} 또는 do...end 블록은 아주 쉽게 볼 수 없으며, 위의 블록이 시작하여 접히기 위해 끝나는 위의 "올바른"방법을 찾을 수 없기 때문에 이해할 수 없습니다 (이해할 수 있습니다).

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

추신 : 2 레벨의 폴딩을 가질 수 있다는 점을 고려하면 외부 연속 만 걱정합니다 (i가있는 블록).

도움이 되었습니까?

해결책

솔직히 말해서, 복잡한 것은 아마도 그것을 유지 해야하는 다른 사람만큼 텍스트 메이트를 혼란스럽게 할 것입니다.

단일 값으로 롤업하는 것을 볼 때마다 열거 가능한#인젝트를 사용하는 것이 좋습니다.

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

예에서 이상한 점은 Select를 사용하여 전체 배열을 반환하고 TO_I를 사용하여 변환 된 것으로 추정되지만 실제로 열거 가능한#Select는 그러한 일을하지 않고 대신 함수가 NIL을 반환하는 것을 거부하는 것입니다. 나는 그것이 당신의 가치가 없다고 가정합니다.

또한 .Average 메소드가 구현되는 방식에 따라 부동 소수점 값을 사용하기 위해 0 대신 0.0으로 주입 호출을 시드 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top