2008/08/12 01:43
bs는 궁금하다.
begin/end 와 do/end는 무었이 다른가?
=> begin/end는 block expression이고, do/end는 code block이다.
blcok expressions
- begin 과 end 사이에 포함된 표현식들(expressions).
- block expressions의 결과값은 마지막 expression의 수행 결과이다.
- 예외 처리에서 많이 볼 수 있다.
- begin
- expressions
- rescue
- handles exception
- end
- 메쏘드를 정의할 때는 begin을 생략할 수 있는데, 그것은 def 에 begin이 포함되어 있기 때문이다.
- def method
-
expressions
- rescue
-
handles exception
- end
- 코드가 바로 수행된다.
code block
- do와 end 사이에 있는 루비 표현식들
- || 안에 argument들을 가질 수 있다.
- 단독으로 사용될 수 없으며, 메쏘드 호출(method invocation) 바로 뒤에 나와야만 한다.
- invocation do |arg|
- end
- 메쏘드 안에서 yield 를 이용해서 code block을 수행할 수 있다.
- code block이 주어진 경우 메쏘드의 마지막 파라미터로 code block을 얻어올 수 있다. 또한 Proc#call을 이용해서 블록을 수행할 수 있다.
- def invocation *args, &block
-
block.call
-
yield
- end
- closuer 로 동작한다.(블록이 정의된 부분의 환경(예를 들면 메쏘드 안의 변수)을 기억한다.)
- 코드의 수행이 지연된다. yield 혹은 Proc#call 이 불려지는 시점에서 코드가 수행된다.
Proc
- code block은 Proc.new 나 Kernel#proc을 이용해서 Proc 클래스의 객체로 변환된다. 위에서 메쏘드의 마지막 파라미터로 전해지는 것도 Proc 객체이다.
- Proc 객체의 code block은 Proc#call을 이용해 실행할 수 있다.
이 글은 스프링노트에서 작성되었습니다.
'Ruby' 카테고리의 다른 글
| [Ruby] mechanize gem을 이용해 웹사이트와 통신하기 (0) | 2009/06/16 |
|---|---|
| [ruby] RDOC 을 위한 주석 달기 (0) | 2009/02/23 |
| [Ruby] block expressions, 그리고 code block (0) | 2008/08/12 |
| [Ruby] or 와 || 의 차이 (0) | 2008/08/12 |
| wxRuby를 이용해 데스크탑 애플리케이션 만들기 (0) | 2008/08/06 |
| [Ruby] 디렉토리 모두 지우기 (0) | 2008/05/28 |