루비 블록


루비가 메소드를 어떻게 정의하고 어떻게 호출하는지 이미 알고 계실 겁니다. 마찬가지로 Ruby에는 블록이라는 개념이 있습니다.

  • 블록은 많은 양의 코드로 구성됩니다.

  • 블록에 이름을 지정해야 합니다.

  • 블록 내부의 코드는 항상 중괄호 {}로 묶입니다.

  • 블록은 항상 같은 이름을 가진 함수에서 호출됩니다. 즉, 블록 이름이 test인 경우 test 함수를 사용하여 이 블록을 호출해야 한다는 의미입니다.

  • yield 문을 사용하여 블록을 호출할 수 있습니다.

Syntax

block_name{
   statement1
   statement2
   ..........
}

여기에서는 간단한 yield 문을 사용하여 블록을 호출하는 방법을 배웁니다. 또한 매개변수와 함께 yield 문을 사용하여 블록을 호출하는 방법도 알아봅니다. 이 예에서는 두 가지 유형의 yield 문을 모두 볼 수 있습니다.

yield

Yield 문의 예를 살펴보겠습니다.

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

def test
   puts "在 test 方法内"
   yield
   puts "你又回到了 test 方法内"
   yield
end
test {puts "你在块内"}


위 예의 결과는 다음과 같습니다.

在 test 方法内
你在块内
你又回到了 test 方法内
你在块内

매개변수가 포함된 Yield 문을 전달할 수도 있습니다. 다음은 예시입니다.

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

def test
   yield 5
   puts "在 test 方法内"
   yield 100
end
test {|i| puts "你在块 #{i} 内"}


위 예시의 결과는 다음과 같습니다.

你在块 5 内
在 test 方法内
你在块 100 内

여기서 yield 문 뒤에는 매개변수가 옵니다. 여러 매개변수를 전달할 수도 있습니다. 블록에서는 두 개의 수직 막대 사이에 변수를 배치하여 매개변수를 적용합니다. 따라서 위 코드에서 Yield 5 문은 값 5를 매개변수로 테스트 블록에 전달합니다.

이제 다음 명령문을 살펴보세요.

test {|i| puts "你在块 #{i} 内"}

여기서는 변수 i에 값 5가 수신됩니다. 이제 다음 puts 문을 살펴보세요.

puts "你在块 #{i} 内"

이 puts 문의 출력은 다음과 같습니다.

你在块 5 内

여러 매개변수를 전달하려는 경우 yield 문은 다음과 같습니다.

yield a, b

이 시점에서 블록은 다음과 같습니다.

test {|a, b| statement}

매개변수는 쉼표로 구분됩니다.

블록과 메소드

블록과 메소드가 어떻게 서로 연관되어 있는지 살펴보았습니다. 일반적으로 항복 문을 사용하여 이름이 같은 메서드에서 블록을 호출합니다. 따라서 코드는 다음과 같습니다.

#!/usr/bin/ruby

def test
  yield
end
test{ puts "Hello world"}

이 예제는 블록을 구현하는 가장 간단한 방법입니다. yield 문을 사용하여 테스트 블록을 호출합니다.

그러나 메소드의 마지막 매개변수 앞에 &가 있으면 메소드에 블록을 전달할 수 있으며 블록은 마지막 매개변수에 할당될 수 있습니다. *와 &가 동시에 매개변수 목록에 나타나면 &가 뒤에 위치해야 합니다.

#!/usr/bin/ruby

def test(&block)
   block.call
end
test { puts "Hello World!"}


위 예제의 결과는 다음과 같습니다.

Hello World!

BEGIN 및 END 블록

각 Ruby 소스 파일은 파일이 로드될 때 실행되고 이후에 실행될 코드 블록(BEGIN 블록)을 선언할 수 있습니다. 프로그램은 코드 실행 블록(END 블록)을 완료합니다.

#!/usr/bin/ruby

BEGIN { 
  # BEGIN 代码块
  puts "BEGIN 代码块"
} 

END { 
  # END 代码块
  puts "END 代码块"
}
  # MAIN 代码块
puts "MAIN 代码块"

프로그램에는 여러 개의 BEGIN 및 END 블록이 포함될 수 있습니다. BEGIN 블록은 나타나는 순서대로 실행됩니다. END 블록은 표시된 순서와 반대로 실행됩니다. 위 프로그램을 실행하면 다음과 같은 결과가 생성됩니다.

BEGIN 代码块
MAIN 代码块
END 代码块