클로저란?
클로저는 클로저가 호출되는 환경에 바인딩된 변수가 있는 함수 코드 블록입니다.
클로저에는 몇 가지 중요한 속성이 있습니다.:
- 그것은 객체처럼 주위에 전달 될 수 있습니다(하지만 반드시 우리가 아래에서 논의 할 것이다로,객체임을 의미하지 않는다),
- 폐쇄는 하나의 범위에서 정의 될 수 있으며,완전히 다른 범위에서 호출 될 수있다,
- 그것은 창조의 시간에 그 범위 내에서 변수를 기억합니다; 이 호출 될 때,그들은 그 현재 범위에 있지 않을 수 있습니다 경우에도 해당 변수에 액세스 할 수 있습니다—폐쇄가 정의 된 당시의 어휘 환경에 대한 지식을 유지하는 것을 의미한다.
블록
블록은 루비에서 간단한 형태의 클로저입니다. 기본적으로 루비의 다른 모든 것들과 달리 블록은 객체가 아닙니다.
블록은do...end
또는{}
로 구성됩니다.
반복기 및 열거자를 사용하는 블록에 대해 이미 알고 있어야 합니다.
다음은 블록의 두 가지 친숙한 예입니다:
.each
열거자 메서드는 블록을 인수로 받아들이고 컬렉션의 각 요소에 대해 지정된 블록을 한 번 호출합니다.before(:each)
메서드는 동일한 컨텍스트 내에서 각 테스트에 대해 산출하는 블록을 제공합니다.
before(:each) do @language = "Ruby"end
:
- 로컬 변수에 프로시저를 할당할 수 있고,
- 프로시저 인스턴스는
call
메서드를 호출하여 실행되며, - 둘 이상의 프로시저를 메서드에 전달할 수 있습니다.
그러나 본질적으로 발동은 발동 클래스의 인스턴스에 할당되어 객체로 전환 된 블록입니다.
따라서 프로시저의 생성은 클래스의 인스턴스화와 매우 유사합니다.
여기서 우리는 발동 클래스의 인스턴스에 블록을 할당하고 변수에 할당하고 있습니다. 그런 다음.call
메소드를 호출하고 있습니다:
greeting = Proc.new { "Hello!" }greeting.call=> "Hello!"
프로시저는.call
메서드에 전달되는 인수를 받아들일 수도 있습니다:
greeting = Proc.new { |name| "Hello, #{name}!" }greeting.call("Amanda")=> "Hello, Amanda!"
람다
람다는 기능면에서 프로세스와 크게 다르지 않습니다.
다음은 열거자에 각각 전달되는 람다입니다. &
는 그것을 블록으로 바꾸기 전에 각각 인수로 기대합니다.
plus_one = lambda { |n| puts n + 1 }array = array.each(&plus_one)=> 2=> 3=> 4
람다는이 재미있는 방법으로 선언 할 수 있습니다:
plus_one = ->(n) { puts n + 1 }
람다와 프로 시저는 거의 같은 의미로 사용되지만 둘 사이에는 몇 가지 차이점이 있습니다:
- 람다는 인수의 일정 금액을 예상하고 그들을 확인;발동은 누락 된 인수에 대한
nil
를 반환하지만,오류를 발생하지 않습니다 - 그들은 다르게 반환:람다는 호출하는 방법으로 돌아 및 발동은 호출자로 돌아 가지 않고 즉시 반환—본질적으로,람다는 더 메소드 호출처럼 행동:당신은 익명 함수로 생각할 수
닫기 생각
이것이 당신,특히 발동과 람다가 혼란 스럽다면 걱정하지 마십시오! 발동 및 람다는 굉장하고 재미 있고 강력한 코드를 작성할 수 있습니다. 그런데,나날이 너는 그들에 많게 일하고 있지 않을 것이다. 블록은,그러나,당신은 매일 상호 작용합니다. 그들을 가장 잘 아는 데 집중하십시오.