[루비 사용자 가이드] 프로시저 객체

루비/레일스 프로그래밍/루비 사용자 가이드 2009.02.05 18:23

때로 예기치 않았던 이벤트에 대한 응답을 명시해야 할 필요성이 있습니다. 그런 목표는 다른 메소드에
코드의 묶음을 전달할 수 있을 때 쉽게 달성될 수 있습니다. 이를 위해서 코드를 마치 데이터처럼
다룰 수 있으면 좋을 것입니다.

새로운 프로시저 객체(rocedure object)proc을 사용해 만들 수 있습니다.

ruby> quux = proc {
    |   puts "QUUXQUUXQUUX!!!"
    | }
   #<Proc:0x4017357c>

이제 quux는 객체를 가리킵니다. 이 객체는 다른 모든 객체들과 마찬가지로 호출될 수 있는 여러 행동 방식을 가지게 됩니다. 특별히, 이 객체가 실행될 것을 call 메소드를 호출해 요청할 수 있습니다.

ruby> quux.call
QUUXQUUXQUUX!!!
   nil

그건 그렇고, quux가 메소드의 인자로 사용될 수 있을까요? 물론입니다.

ruby> def run( p )
    |   puts "About to call a procedure..."
    |   p.call
    |   puts "There: finished."
    | end
   nil
ruby> run quux
About to call a procedure...
QUUXQUUXQUUX!!!
There: finished.
   nil

trap 메소드는 우리가 어떤 시스템 시그널에 대한 응답을 정의할 수 있도록 합니다.

ruby> inthandler = proc{ puts "^C was pressed." }
   #<Proc:0x401730a4>
ruby> trap "SIGINT", inthandler
   #<Proc:0x401735e0>

일반적으로 ^C를 누르면 인터프리터가 중단되도록 합니다. 하지만 위 코드를 실행한 다음에는 메시지가 프린트되고 인터프리터는 계속 실행됩니다. 이에 따라 진행중이던 작업을 잃어버리지 않게 됩니다.(인터프리터 안에 영원히 갇혀 있을 걱정은 마십시오. exit를 입력하면 인터프리터를 종료시킬 수 있습니다.)

다른 주제로 가기 전에 마지막으로 한 가지 더 짚어두고 갈 것이 있습니다. 시그널에 프로시저 객체를 바인딩하기 위해, 그 프로시저 객체에 꼭 이름을 붙여야만 하는 것은 아닙니다. 다음과 같이 이름없는(nonymous) 프로시져 객체를 사용할 수 있습니다.

ruby> trap "SIGINT", proc{ puts "^C was pressed." }
   nil

위 문장은 다음과 같이 더 짧게 작성할 수도 있습니다.

ruby> trap "SIGINT", 'puts "^C was pressed."'
   nil

이런 형태는 간단한 이름 없는 프로시저 객체를 작성할 때 편하고 읽기 쉽게 해 줍니다.

Trackbacks 0 : Comments 0