블록은 Ruby에서 매우 중요한 부분이므로 블록이 없는 언어는 상상하기 어렵습니다. 하지만 람다? 누가 람다를 좋아합니까? 당신은 하나를 사용하지 않고 몇 년을 갈 수 있습니다. 마치 과거의 유물처럼 보입니다.
...하지만 그것은 사실이 아닙니다. 람다는 조금만 조사해 보면 흥미로운 속임수를 쓸 수 있습니다.
이 기사에서는 람다 사용법의 기초부터 시작하여 좀 더 흥미로운 고급 사용법으로 넘어갈 것입니다. 따라서 매일 람다를 사용하고 이에 대해 모두 알고 있다면 아래로 스크롤하십시오.
Lambda에 대해 기억해야 할 주요 사항은 Lambda가 함수처럼 작동한다는 것입니다. 블록과 프로시저는 용도가 있습니다. 그러나 둘 다 실제 함수처럼 100% 작동하지 않습니다. 람다가 합니다. 목록을 아래로 내려갑시다.
Lambdas는 올바른 수의 인수를 적용합니다.
Procs와 달리 람다는 올바른 수의 인수를 적용합니다.
람다는 기본 인수를 지원합니다.
아래 예에서는 기본 인수 값이 "hello world"인 람다 함수를 만듭니다.
Lambda는 기본 인수를 지원합니다.
return
키워드가 정확히 예상대로 작동합니다.
작은 소리처럼 들릴 수도 있지만 proc 내부에서 return을 사용해 본 적이 있다면 그렇지 않다는 것을 알 수 있습니다.
아래 예는 내가 의미하는 바를 보여줍니다. something
이라는 메서드를 정의했습니다. Proc
를 호출하는 . Proc
반환문이 있습니다. 그러나 그 반환 진술은 까다 롭습니다. 프로시저에서 리턴하는 대신 무언가 메소드에서 리턴합니다.
하지만 lambda
로 비슷한 작업을 수행할 때 , return
문은 람다에서 반환됩니다. 다른 기능과 같습니다.
람다 내에서 return 키워드를 사용하면 람다에서 반환
람다는 폐쇄입니다
훌륭한 스택 오버플로 게시물을 인용하려면:
클로저를 생각하는 가장 간단한 방법은 **변수로 저장할 수 있는 함수**("일급 함수"라고 함)로, 로컬에 있는 다른 변수에 액세스할 수 있는 특별한 기능이 있습니다. 생성된 범위입니다.람다가 생성된 범위에 로컬인 다른 변수에 액세스할 수 있다는 것은 무엇을 의미합니까? 한 번 보자. 아래 예에서는
marco
라는 로컬 변수를 만들었습니다. . 내 람다 내부에서 해당 변수를 사용할 수 있습니다. 그리고 해당 변수의 값을 변경하면 람다가 새 값을 봅니다.Ruby 람다는 클로저입니다.
람다는 카멜레온입니다
람다에 대한 정말 이상한 점 중 하나는 람다를 호출할 수 있는 다양한 방법입니다. 아래 샘플은 람다를 호출하는 세 가지 방법을 보여줍니다. 모두 동등합니다.
Ruby에서 람다를 호출하는 방법은 적어도 세 가지가 있습니다.
아마도 이것은 당신에게 조금 이상하게 보일 것입니다. 처음에는 그랬습니다. 그리고 솔직히 말해서
l.(arg)
구문은 여전히 나를 당황하게 합니다. 하지만l[arg]
구문은 꽤 흥미롭습니다. 즉, 일반적으로 배열이나 해시를 사용하는 곳에서 람다를 사용할 수 있다는 의미입니다.람다를 계산된 해시 및 배열로 사용
테스트 스위트가 있다고 상상해보십시오. 초기화의 일부로 가짜 Person 레코드를 생성해야 합니다. 간단 해. 새 FakePerson 레코드를 만들고 이름과 성을 전달하기만 하면 됩니다.
그러나 테스트가 실행될 때마다 다른 이름과 성을 사용하여 시스템을 "퍼즈 테스트"하려면 어떻게 해야 합니까?
이를 수행하는 한 가지 방법은 해시 대신 람다 함수를 전달하는 것입니다. . 이 예에서는 람다 함수를 사용하여 우수한 Faker gem을 통해 가짜 이름을 생성합니다.
여기에서 람다는 해시인 것처럼 가장합니다.
람다에는 카레링 기능이 내장되어 있습니다.
Currying은 함수형 프로그래밍에서 많이 사용되는 멋진 기술입니다. 기존 함수에서 새 함수를 만들 수 있는 방법입니다. 실전에서 보면 이해하기 쉽습니다.
아래 코드에는 두 개의 숫자를 더하는 람다 함수가 있습니다. 편의상 추가라고 합니다. 그런 다음 커링을 사용하여 increment라고 하는 좀 더 전문화된 함수를 만듭니다. 주어진 숫자에 1을 더하기만 하면 됩니다.
Ruby에서 모든 프로세스를 커리링할 수 있습니다.
람다는 특별한 종류의 Proc입니다.
모든 코드 샘플에서 내가 람다 함수를 정의할 때마다 그 대가로 Proc를 얻는다는 것을 눈치채셨을 것입니다. Ruby가 람다를 일종의 Proc로 구현하기 때문입니다. 따라서 이 기사에서 보여드린 많은 작업은 람다뿐만 아니라 Procs로 수행할 수 있습니다.
스태비 람다
이 기사에서는 명확성을 위해 람다 키워드를 사용했습니다. 그러나 Ruby 1.9에 도입되고 "stabby lambda"로 알려진 람다를 정의하기 위한 보다 간결한 구문이 있습니다. 작동 방식은 다음과 같습니다.
Ruby의 스태비 람다 구문이 버전 1.9에서 도입되었습니다.