[Ruby] 익명함수와 람다. 블럭

[원본 링크]

루비에서는 콜백처리에 블럭과 익명함수를 사용할 수 있다.

일단 블럭은 함수와는 다르지만 재사용할 수 있는 코드블럭이다.
{ ... } 와 do ... end 두가지 방식으로 표현한다.


Proc.new
Proc 클래스의 new 메서드를 사용하면 익명함수를 생성할 수 있댜.
Proc.new{ |인자| ... }로 표현하는데, 인자가 없다면 인자부는 생략가능하다.
함수의 호출은 call 메서드나 .(), []만을 사용해야 한다. image

image 잘못썼는데 []에서 점은 빼야한다. 저게 왜 동작하지?

proc
치기가 귀찮다면 Proc.new 대신 더 짧은 proc 함수를 써도 좋다. 이건 Proc.new와 완전히 같다. image

image

그리고 저 중괄호 짝들은 do-end 구문으로 대체할 수도 있다. 애초에 중괄호나 do-end나 같은 블럭이고, Proc.new는 블럭을 받아서 객체로 만들어주는 놈이기 때문이다. image

image

고차함수에 블럭만을 넘길 수도 있다. 대신 고차함수의 인자이름 앞에 &를 붙여서 함수객체 Proc로 변환할 것이라는 명시를 해줘야 한다. image

image 그런데 이 proc으로 생성한 함수객체는 다 기능적인 결함이 많은 멍청이다. 인자개수도 검사하지 않고 값을 반환할때도 문맥을 전혀 고려하지 않기 때문이다.
가령 어떤 함수에서 proc 함수를 호출해서 proc 함수에서 리턴을 했다면, 그걸 실행한 함수까지 전부 종료시키고 전역에다 리턴을 해버린다.

가급적이면 proc 객체를 넘기거나 블럭을 넘기기보단, 람다를 사용하는 것이 좋다.


람다
람다는 제대로된 Proc 함수객체다.

람다식은 lambda { |인자| ... }
로 표현된다. 루비 1.9부터는 lambda 대신 ->로 쓸수 있다고 한다.
사용법은 상기한 Proc 객체들과 동일하다. do-end로 바꿀수도 있고...

아래는 사용례다. image

image


참조
https://www.44bits.io/ko/post/ruby-proc-and-lambda