루비 블록에 대한 또 다른 게시물
#each
, #select
및 #map
와 같은 내장 메서드를 이미 사용했을 것입니다. 모든 사람들이 루비 마법에 대해 말하지만, 그 방법이 작동하는 방식에는 특별한 것이 없습니다.이러한 메서드는 일반적으로 인라인 블록(중괄호로 묶인 코드) 또는 여러 줄 블록(
do
및 end
사이에 묶인 코드)을 사용하여 배열 및 해시와 같은 컬렉션에서 호출됩니다.블록은 어떻게 작동합니까?
우리는 종종 코드 블록을
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
를 사용해 보십시오. 결과에 놀랄 것입니다!아래 의견에 질문 및/또는 제안 사항이 있으면 알려주십시오!
Reference
이 문제에 관하여(루비 블록에 대한 또 다른 게시물), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/yagosansz/yet-another-post-about-ruby-blocks-3h79텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)