Ruby 열거 가능한 그룹 이해

17723 단어 railsruby

소개하다.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]]]
    
    이것은 정렬 목록의 상하문에서 더욱 유용하지만, 이러한 상황에서partitionBoolean류 조건에 더 의미가 있고, 여러 조건group_by에 더 의미가 있다.chunk는 프로그래밍에서 자주 볼 수 없는 방법이지만 Subversion Products나 다른 유닉스 형식의 출력 로그를 처리할 때 특수한 용도가 있다.

    Note: You might notice to_a on a few of these methods, that's because they return an Enumerator rather than an Array, 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_sliceeach_cons와 비슷하지만 다른 점은 each_cons와 같은 원소 슬라이딩 창이 아닌 다른 슬라이드를 되돌려준다는 점이다.
    (1..10).each_slice(3).to_a
    # => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
    
    이것은 일정한 크기의 그룹으로 원소를 처리하는 데 도움이 된다.때로는 to_hzip와 짝을 지어 재미있는 일을 할 수도 있다.
    (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_afterslice_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_whenbefore와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의 각 부분을 소개하고 기능에 따라 그룹을 나눌 것이다.
  • 변환
  • 술어조건
  • 검색 및 필터링
  • 정렬 및 비교
  • 계수
  • 그룹
  • 합병
  • 교체 및 획득
  • 협박
  • Enumerablelazy의 일부이지만 그 자체로 하나의 댓글을 받아야 한다. 우리도 곧 이 댓글을 받을 것이다.
    저의 작문과 일을 알고 싶으세요?Take a look at my new newsletter: The Lapidary Lemur

    좋은 웹페이지 즐겨찾기