루비 블록에 대한 또 다른 게시물

8142 단어 rubybeginners
한동안 Ruby로 프로그래밍을 했다면 아마도 #each , #select#map 와 같은 내장 메서드를 이미 사용했을 것입니다. 모든 사람들이 루비 마법에 대해 말하지만, 그 방법이 작동하는 방식에는 특별한 것이 없습니다.

이러한 메서드는 일반적으로 인라인 블록(중괄호로 묶인 코드) 또는 여러 줄 블록(doend 사이에 묶인 코드)을 사용하여 배열 및 해시와 같은 컬렉션에서 호출됩니다.

블록은 어떻게 작동합니까?



우리는 종종 코드 블록을 Enumerable 모듈을 통해 사용할 수 있는 메서드와 연결합니다. 아래 예를 살펴보십시오.
  • 인라인 블록:

  • [1, 2, 3, 4, 5].select { |number| number.even? }
    
    > [2, 4]
    


  • 여러 줄 블록:

  • [1, 2, 3, 4, 5].select do |number|
      number.odd?
    end
    
    > [1, 3, 5]
    


    블록이 어떻게 작동하는지 완전히 이해하려면 핵심 세부 사항을 파악하기 위해 사용자 지정 블록을 만드는 방법을 배워야 합니다!

    블록에 대한 제어 양보



    Ruby의 모든 메소드는 블록과 연관될 수 있지만 메소드 실행 중에 해당 블록이 호출되는지 여부를 결정하는 것은 특수 키워드yield 입니다.

    roll_die { |number| puts "You rolled #{number}" }
    


    그 방법을 어떻게 구현할 수 있습니까?

    def roll_die
      puts "Method is executing..."
      random_number = rand(1..6)
      yield(random_number)
      puts "Method is done!"
    end
    


    따라서 연결된 블록과 함께 roll_die 메서드를 호출하면 콘솔에 다음 줄이 인쇄됩니다.

    > "Method is executing..."
    > "You rolled 3"
    > "Method is done!"
    

    yield가 수행하는 작업은 roll_die 메서드의 실행을 "일시 중지"하고 연결된 블록으로 제어를 전달하는 것입니다. 또한 random_number 매개변수를 블록 매개변수로 블록에 전달합니다!

    블록에 대한 호기심은 일단 실행이 완료되면 마지막으로 계산된 코드 라인을 최종 결과로 반환한다는 것입니다! 잠깐만요...그게 무슨 뜻인가요?

    대신 다음과 같이 할 수 있음을 의미합니다.
  • roll_die 메서드에서 코드 재정렬:

  • def roll_die
      puts "Method is executing..."
      random_number = rand(1..6)
      result = yield(random_number)
      puts "You rolled #{result}"
      puts "Method is done!"
    end
    


  • roll_die 메서드와 연결된 코드 블록 재정렬:

  • roll_die do |number|
      puts "Rolling the die..."
      number
    end
    


    위의 새 배열에서 난수는 yield에 의해 반환되고 result 메서드에서 변수roll_die에 할당됩니다!

    > "Method is executing..."
    > "Rolling the die..."
    > "You rolled 1"
    > "Method is done!"
    


    Ruby 블록에 대한 주의 사항



    여기까지 읽으셨다면 yield 제어권을 넘길 관련 블록이 없는 경우 어떻게 되는지 궁금하실 것입니다. 이러한 시나리오에서는 block_given? 방법을 사용할 수 있습니다. 아래 예를 확인하십시오.
  • greeting(name) 방법 정의:

  • def greeting(name)
      if block_given?
        yield(name)
      else
        "No block was given."
      end
    end
    


  • greeting(name) 메서드를 블록과 연결:

  • greeting(name) { |name| "Hello,  #{name}!" }
    


    이제 greeting(name) 메서드를 호출하는 두 가지 방법이 있습니다.

    # First way
    greeting("Mary") { |name| "Hello,  #{name}!" }
    
    > "Hello,  #{name}!"
    
    # Second way
    greeting("John")
    
    > "No block was given."
    


    또 다른 호기심은 yield 에 전달된 매개변수의 수에 관한 것입니다. 이 매개변수는 블록 매개변수로 블록에 전송됩니다. Ruby에 의해 시행/요청됩니까? irb를 사용해 보십시오. 결과에 놀랄 것입니다!

    아래 의견에 질문 및/또는 제안 사항이 있으면 알려주십시오!

    좋은 웹페이지 즐겨찾기