2011년 6월 2일 목요일

Blocks for Transactions

Blocks for Transactions

블록이 주로 반복자에 초점이 맞춰지기는 하지만 다른 사용법도 있다. 트랜젝션 제어 하에서 동작해야만 하는 코드를 작성 할 때 블록을 사용할 수 있다.

class File
 def File.openAndProcess(*args)
   f = File.open(*args)
   yield f
   f.close()
 end
end
File.openAndProcess("testfile", "r") do |aFile|
 print while aFile.gets
end

위 예제는 파일을 열고, 그 내용을 출력하고 이 작업을 마치면 파일이 닫히게 된다.
openAndProcess메서드의 인자 *args는 실제로 메서드에서 넘겨받은 매개변수를 모아서 배열로 만들고 이름를 args라고 붙여라는 뜻이다. File.open 메서드를 이용해서 파일 객체를 열고 이를 yield f로 블록 변수 aFile로 전달 한다. print와 while 문으로 파일의 내용을 출력하면 f.close 메서드가 실행되어 파일이 닫히게 된다. 이와 같이 함으로써 열림 파일의 핸들을 닫아야 하는 책임이 파일 객체의 사용자로 부터 파일 객체 자체로 넘아가게 된다. 파일 객체가 스스로 자신의 생명주기를 관리하는 이 기법은 아주 유용한 것이며 루비의 File 클래스에서 직접 이런 기능을 지원한다. openAndProcess 메서드를 호출 할때 블록이 전달 되었는지를 확인 할수도 있다.

class File
 def File.myOpen(*args)
   aFile = File.new(*args)
   # If there's a block, pass in the file and close
   # the file when it returns
   if block_given?
     yield aFile
     aFile.close
     aFile = nil
   end
   return aFile
 end
end

block_given?는 메서드 호출시 블록이 전달 되었는지를 판단 할수 있게 해준다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...