오늘은 slice_before
에 대해 이야기하겠습니다. , slice_when
및 slice_after
. 임의의 기준에 따라 배열 또는 기타 열거 가능한 항목을 그룹화해야 할 때 매우 유용한 방법입니다.
Array#slice
에 익숙할 것입니다. . 인덱스 범위를 기반으로 배열의 하위 집합을 가져올 수 있습니다.
a = ["a", "b", "c"]
a.slice(1, 2)
# => ["b", "c"]
이것은 유용하지만 열거형에는 인덱스가 없기 때문에 열거형에는 사용할 수 없습니다.
slice_before
, slice_when
및 slice_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_when
및 slice_after
모든 셀 수 있습니다.
예를 들어 많은 이메일이 포함된 파일이 있는 경우 slice_before
를 사용하여 개별 이메일을 분할할 수 있습니다. . 아래 코드는 문서에서 가져온 것입니다.
open("mbox") { |f|
f.slice_before { |line|
line.start_with? "From "
}.each { |mail|
puts mail
}
그리고 슬라이스 메서드는 배열을 반환하지 않는다는 점에 유의하십시오. 그들은 열거형을 반환합니다. 즉, map
을 사용할 수 있습니다. , each
및 기타 모든 좋아하는 열거 가능한 방법. 젠장, 또 다른 분할을 할 수도 있습니다. :)