Ruby의 Enumerableeach 진도를 표시하는 방법

6949 단어 Ruby
이런

컨디션

  • Ruby 2.5.1
  • 이루어지다


    표준 출력에 진도를 표시하는 방법Enumerable.each_with_progress을 추가했습니다.
    index.rb
    module Enumerable
      def each_with_progress(&block)
        self.each_with_index do |element, index|
          print "\r#{index + 1}/#{self.length}"
          block.call(element, index)
        end
        print "\r\n"
      end
    end
    
    print 문장을 수정하면 비례로 표시할 수 있고 많은 일을 할 수 있다고 생각합니다.

    호출단 코드


    index.rb
    puts "# program start"
    
    ['a','b','c'].each_with_progress do |elem|
      sleep 1
      print " #{elem}"
    end
    
    ['a','b','c'].each_with_progress do |elem, index|
      sleep 1
      print " #{index} -> #{elem}"
    end
    
    puts "# program end"
    

    실행 결과

    $ ruby index.rb
    # program start
    3/3 c
    3/3 2 -> c
    # program end
    

    Enumerable를 통한 구현


    상술한 예는 수조 등length 방법으로 정의된 클래스에서만 사용할 수 있다.
    Enumerablelength에서 실현되지 않은 클래스(예를 들어 범위 대상 등)에서는 length로 대체Enumerable.count를 사용한다.
    index.rb
    module Enumerable
      def each_with_progress(&block)
        length = self.respond_to?(:length) ? self.length : self.count
    
        self.each_with_index do |element, index|
          print "\r#{index + 1}/#{length}"
          block.call(element, index)
        end
        print "\r\n"
      end
    end
    
    이렇게 하면 Enumerable 모듈이 상속된 객체에서 수행할 수 있습니다.

    호출단 코드


    index.rb
    puts "# program start"
    
    sum = 0
    (1..10000).each_with_progress do |elem|
      sum += elem
    end
    puts sum
    
    puts "# program end"
    

    실행 결과

    $ ruby index.rb
    # program start
    10000/10000
    50005000
    # program end
    

    참고 자료

  • count(Enumerable) - 루비 참조
  • [Rubby] 표준 출력은 멋진 진전을 보여줍니다. - 원조 SE는 엔지니어가 되는 것을 목표로 하는 블로그입니다.
  • 루비에서 size, length, count의 차이점 - Qita
  • 좋은 웹페이지 즐겨찾기