ruby Proc에 대해 알아보자

Posted by negabaro kim on Sunday, March 21, 2021 Tags: ruby   1 minute read

block,proc,lambda관련 포스팅 인덱스

Proc이란?

block을 객체화한 녀석

Proc은 Procedure의 줄임말로 어떤 처리 과정을 담고 있다는 의미를 가진다.

그래서 Proc과 같은 녀석을 절차 오브젝트라고도 부른다.

Proc객체 만드는법

일반적인 루비 클래스와 같이 Proc.new메소드에 block을 넘겨주면 객체 생성이 가능

Proc.new do
 pp 'proc'
end

인자에 block을 넘겨주지 않으면 에러가 발생

Proc.new #=>  ArgumentError: tried to create Proc object without a block

반드시 하나의 block인자가 필요하다.

block을 객체화 하는 이유?

block을 객체화하면 변수에 담을 수 있는게 가장 큰 메릿이다.

block자체를 특정 메소드에 넘길때는 하나의 block밖에 넘길 수 없는데 Proc으로 만들어 놓으면

복수의 block 인자를 넘겨서 넘겨 받은 메소드내에서 실행이 가능하다.

Proc객체 생성후

Proc.new로 객체 생성후 Proc 객체를 반환만 하고 어떠한 일도 일어나지 않고 해당 객체를 변수에 저장해둔다.

Proc 객체 실행

변수에 대입후 해당 Proc객체를 .call()해주면 비로서 실행이가능하다 .yield()로 실행이 가능

.call(),.yield()외에도 .()[]와 같은 방법이 있는데 가독성이 좆망이라 많이 사용하지는 않음.

.call() 메서드를 사용한 호출법과 작동 방식은 완벽히 일치

ex)

p = Proc.new { puts '다현!'}

p.call()
# 다현!

p.yield()
# 다현!

p.()
# 다현!

p[]
# 다현!