Ruby 열거 가능한 그룹 이해
소개하다.
Enumerable
. 논의할 점은 Ruby에서 가장 강력한 기능 중 하나입니다.프로그래밍에서 대부분의 시간을 프로젝트 집합을 처리하기 때문에, 자주 사용되는 것을 보는 것도 이상할 게 없다.곤란하다
기초적
루비의 함수에 대해 어느 정도 알고 있다.이 글은 루비 프로그래머의 기초 지식에 주목한다.
사전 요구 사항 읽기:
열거할 수 있다
Enumerable
는 인터페이스 모듈로 집합을 처리하는 여러 가지 방법을 포함한다.많은 루비 클래스는 집합처럼 보이는 Enumerable
인터페이스를 구현했다.만약 그것이 each
지원하는 방법 Enumerable
이 있다면, 그것은 루비에 없는 곳이 없을 것이다.Note: This idea was partially inspired by Lamar Burdette's recent work on Ruby documentation, but takes its own direction.
조를 나누다
루비는 집합을 그룹화하는 방법까지 있을 정도로 흥미로운 팀과 코드다.
#partition
partition
요소를 조건에 따라 두 개의 다른 그룹으로 나눕니다.[1, 2, 3, 4].partition(&:even?)
# => [[2, 4], [1, 3]]
group_by
가 불합리하고 원소를 그룹으로 나누는 데 두 개의 다른 그룹만 있을 때 유용합니다.여기에 분해 임무를 더하면 정말 유용하다.evens, odds = [1, 2, 3, 4].partition(&:even?)
{ evens: evens, odds: odds }
# => {:evens=>[2, 4], :odds=>[1, 3]}
Ruby에서는 당신이 원하는 결과를 얻기 위해 최소 출력의 방법을 사용해야 한다는 것을 기억하세요.partition
가 좋은 예다.#chunk
chunk
는 약간 group_by
또는 partition
와 비슷하지만 원소의 블록 그룹을 되돌려줍니다.[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5].chunk(&:even?).to_a
# => [[false, [3, 1]], [true, [4]], [false, [1, 5, 9]], [true, [2, 6]], [false, [5, 3, 5]]]
이것은 정렬 목록의 상하문에서 더욱 유용하지만, 이러한 상황에서partition
는 Boolean
류 조건에 더 의미가 있고, 여러 조건group_by
에 더 의미가 있다.chunk
는 프로그래밍에서 자주 볼 수 없는 방법이지만 Subversion Products나 다른 유닉스 형식의 출력 로그를 처리할 때 특수한 용도가 있다.Note: You might notice
to_a
on a few of these methods, that's because they return anEnumerator
rather than anArray
, and tend to be used by chaining together methods rather than by themselves.
#chunk_while
chunk_while
, 다른 한편, 나는 다음과 같은 용법을 발견했다. 특히 인터뷰에서 다음과 같다.[1,2,4,9,10,11,12,15,16,19,20,21].chunk_while { |i, j| i+1 == j }.to_a
# => [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]
이 예에서, 그것은 연속적인 숫자 블록을 찾을 수 있다.Block 함수는 현재 요소 앞과 뒤에 요소를 공개하여 chunk
보다 요소를 어떻게 조합하는지 결정합니다.만약 당신이 기억하고 있다면
chunk_while
숫자의 최대 승차 체인, 연속 그룹 등 문제는 쉽게 해결될 수 있습니다.#each_cons
each_cons
는 각 연속 문자의 약어입니다.(1..10).each_cons(3).to_a
# => [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9], [8, 9, 10]]
이것은 슬라이딩 창 유형의 알고리즘에 매우 유용하다. 나는 내가 면접에서 자주 사용하는 것을 발견했기 때문에 다시 검색을 시작해야 하기 전에 나는 자주 연습했다Enumerable
.그것은 한 구역이 필요할 수도 있지만, 다른 몇몇 구역과 마찬가지로, 나중에 돌아올 것이다.
nil
즉시 인쇄를 원하신다면, 물론 가능하지만, 다른 Enumerable
방법에 연결되지 않으면, 사용하면 큰 의미가 없습니다.#each_slice
each_slice
는 each_cons
와 비슷하지만 다른 점은 each_cons
와 같은 원소 슬라이딩 창이 아닌 다른 슬라이드를 되돌려준다는 점이다.(1..10).each_slice(3).to_a
# => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
이것은 일정한 크기의 그룹으로 원소를 처리하는 데 도움이 된다.때로는 to_h
나 zip
와 짝을 지어 재미있는 일을 할 수도 있다.(1..10).each_slice(3).to_h { |k, *vs| [k, vs] }
# => {1=>[2, 3], 4=>[5, 6], 7=>[8, 9], 10=>[]}
어쨌든Enumerable
은 어느 정도에 이런 방법을 어떻게 결합시켜 일을 더욱 위대하게 만드는지에 관한 것이다.#slice_before
slice_before
반환true
조건이 충족되기 전에 컬렉션을 슬라이스합니다.gemfile = <<~GEMFILE
# frozen_string_literal: true
source "https://rubygems.org"
# Specify your gem's dependencies in matchable.gemspec
gemspec
# Other gems
gem "rake", "~> 13.0"
# Testing
gem "rspec", "~> 3.0"
gem "guard-rspec"
gem "benchmark-ips"
GEMFILE
gemfile
.lines
.slice_before { |v| v.start_with?('#') }
.map(&:first)
# => ["# frozen_string_literal: true\n", "# Specify your gem's dependencies in matchable.gemspec\n", "# Other gems\n", "# Testing\n"]
이 예에서, 우리는 Gemfile
의 루비를 연구하고 있으며, 모든 평론 줄을 나누기 전에 추천 줄만 잡으려고 한다.때때로 텍스트 파일의 형식이 JSON
처럼 좋지 않을 때가 있습니다. 이것은 당신이 사용할 수 있는 형식으로 분해할 수 있는 좋은 방법입니다.또한 응답
===
모드를 사용하여 이러한 코드를 보다 간결하게 만들 수 있습니다.gemfile.lines.slice_before(/^#/).map(&:first)
#slice_after
slice_after
와 slice_before
는 비슷하지만 조건이 진짜 후절편이다.text = <<~TEXT
Some paragraphs and content here.
...and then a few more after that
TEXT
text.lines.slice_after(/^\n$/).to_a
=> [[" Some paragraphs and content here.\n", "\n"], ["...and then a few more after that\n"]]
slice_before
와 마찬가지로 모드 또는 블록 함수를 사용할 수 있습니다.(1..10).slice_after { |e| e.even? }.to_a
# => [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
#slice_when
slice_when
는 실제chunk_while
와 상반된다. 블록 함수true
가 되돌아올 때 절단하는 것이지 되돌아올 때 절단하는 것이 아니기 때문이다.[1,2,4,9,10,11,12,15,16,19,20,21].slice_when { |i, j| i+1 == j }.to_a
# => [[1], [2, 4, 9], [10], [11], [12, 15], [16, 19], [20], [21]]
[1,2,4,9,10,11,12,15,16,19,20,21].chunk_while { |i, j| i+1 == j }.to_a
# => [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]
false
의 경우 조건을 만족시킬 때 절단하는 것이지 조건을 만족시킨 후 바로 절단하는 것이 아니다.예를 들어 slice_when
before와after 요소가 필요합니다.chunk_while
#group_by
블록 함수를 통해 요소를 그룹화할 수 있습니다. 이 함수 정의 키입니다.우리 앞의 텍스트를 고려해 보자.%w(a fresh lively lemur jumps over a tea kettle).group_by { |w| w[0] }
# => {"a"=>["a", "a"], "f"=>["fresh"], "l"=>["lively", "lemur"], "j"=>["jumps"], "o"=>["over"], "t"=>["tea"], "k"=>["kettle"]}
우리는 모든 단어의 첫 번째 문자에 따라 그룹을 나누어 group_by
s로 되돌릴 수 있습니다. 이것은 내가 Array
계수를 사용하지 않을 때 자주 사용하는 방법입니다.마무리
다음 몇 편의 기사는
tally
의 각 부분을 소개하고 기능에 따라 그룹을 나눌 것이다.Enumerable
는 lazy
의 일부이지만 그 자체로 하나의 댓글을 받아야 한다. 우리도 곧 이 댓글을 받을 것이다.저의 작문과 일을 알고 싶으세요?Take a look at my new newsletter: The Lapidary Lemur
Reference
이 문제에 관하여(Ruby 열거 가능한 그룹 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/baweaver/understanding-ruby-enumerable-grouping-59pl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)