Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

루비 열거형 슬라이싱 및 다이싱

오늘은 slice_before에 대해 이야기하겠습니다. , slice_whenslice_after . 임의의 기준에 따라 배열 또는 기타 열거 가능한 항목을 그룹화해야 할 때 매우 유용한 방법입니다.

Array#slice에 익숙할 것입니다. . 인덱스 범위를 기반으로 배열의 하위 집합을 가져올 수 있습니다.

a = ["a", "b", "c"]
a.slice(1, 2)
# => ["b", "c"]

이것은 유용하지만 열거형에는 인덱스가 없기 때문에 열거형에는 사용할 수 없습니다.

slice_before , slice_whenslice_after 메서드는 인덱스에 의존하지 않으므로 열거 가능한 모든 항목과 함께 사용할 수 있습니다. 살펴보겠습니다!

Enumerable#slice_before 사용

Enumerable#slice_before 매치가 이루어지기 전 시점에서 그룹으로 분할 및 열거 가능합니다.

일치는 ===를 통해 이루어집니다. 연산자, 즉 모든 종류의 항목을 일치시킬 수 있습니다.

값 일치

단일 값을 일치시킬 수 있습니다. 그것은 분명해야합니다. :)

a = ["a", "b", "c"]
a.slice_before("b").to_a
# => [["a"], ["b", "c"]]

정규 표현식 일치

보다 복잡한 텍스트 일치를 위해 정규식을 사용할 수 있습니다.

a = ["000", "b", "999"]
a.slice_before(/[a-z]/).to_a
# => [["000"], ["b", "999"]]

범위 일치

숫자로 작업하는 경우 범위를 기준으로 배열을 조각화할 수 있습니다.

a = [100, 200, 300]
a.slice_before(150..250).to_a
# => [[100], [200, 300]]

수업 일치

이것은 약간 이상하게 보일 수 있지만 ===의 동작과 완전히 일치합니다. 운영자.

a = [1, "200", 1.3]
a.slice_before(String).to_a
# => [[1], ["200", 1.3]]

블록 사용

다른 옵션 중 어느 것도 유연하지 않다면 항상 블록과 프로그래밍 방식으로 일치하는 항목을 찾을 수 있습니다.

a = [1, 2, 3, 4, 5]
a.slice_before do |item|
  item % 2 == 0
end
# => [[1], [2, 3], [4, 5]]

Enumerable#slice_after 사용

Enumerable#slice_after Enumerable#slice_before와 똑같이 작동합니다. 슬라이스가 경기 후에 발생한다는 점을 제외하고. 그림을 이동. :-)

a = ["a", "b", "c"]
a.slice_after("b").to_a
# => [["a", "b"], ["c"]]

물론 정규식, 범위 및 블록을 사용하여 일치시킬 수 있습니다. 지루할 수 있기 때문에 여기에서 그 예를 보여주지 않겠습니다.

Enumerable#slice_when 사용

Enumerable#slice_when slice_before와 다른 짐승입니다. 및 slice_after . 배열의 단일 항목을 일치시키는 대신 인접한 항목 쌍을 일치시킵니다.

즉, 항목 사이의 "가장자리"를 기준으로 항목을 그룹화할 수 있습니다.

예를 들어 여기에서는 인접한 항목에 대한 "가까움"을 기준으로 항목을 그룹화합니다.

a = [1, 2, 3, 100, 101, 102]

# Create a new group when the difference 
# between two adjacent items is > 10.
a.slice_when do |x, y| 
  (y - x) > 10
end
# => [[1, 2, 3], [100, 101, 102]]

자세히 알아보려면 slice_when에 대한 Ruby 문서를 확인하세요. . 몇 가지 훌륭한 코드 예제가 있습니다.

배열 대 열거형

배열은 이해하기 쉽기 때문에 위의 대부분의 예에서 배열을 사용했습니다. slice_before를 사용할 수 있지만 , slice_whenslice_after 모든 셀 수 있습니다.

예를 들어 많은 이메일이 포함된 파일이 있는 경우 slice_before를 사용하여 개별 이메일을 분할할 수 있습니다. . 아래 코드는 문서에서 가져온 것입니다.

open("mbox") { |f|
  f.slice_before { |line|
    line.start_with? "From "
  }.each { |mail|
    puts mail
  }

그리고 슬라이스 메서드는 배열을 반환하지 않는다는 점에 유의하십시오. 그들은 열거형을 반환합니다. 즉, map을 사용할 수 있습니다. , each 및 기타 모든 좋아하는 열거 가능한 방법. 젠장, 또 다른 분할을 할 수도 있습니다. :)