루비 블록
루비가 메소드를 어떻게 정의하고 어떻게 호출하는지 이미 알고 계실 겁니다. 마찬가지로 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 代码块