BLOG main image
분류 전체보기 (239)
Rails (65)
Ruby (34)
이야기 (40)
스토리큐 (61)
그 밖에.. (30)
C# (6)
드리밍 인 코드
The note of Legendre
작은아이의 생각
agiletalk's me2DAY
[rails] Growl4Rails
美소년 ㅇㅅㅇ씨의 一日
마사키군의 생각
ayukawa's me2DAY
작은아이의 생각
agiletalk's me2DAY
63,414 Visitors up to today!
Today 19 hit, Yesterday 22 hit

 SUBSCRIBE

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의 수행 결과이다.
  • 예외 처리에서 많이 볼 수 있다.
  1. begin
  2.   expressions
  3. rescue
  4. handles exception
  5. end
  • 메쏘드를 정의할 때는 begin을 생략할 수 있는데, 그것은 def 에 begin이 포함되어 있기 때문이다.
  1. def method
  2. expressions

  3. rescue
  4. handles exception

  5. end
  • 코드가 바로 수행된다.

 

code block

  • do와 end 사이에 있는 루비 표현식들
  • || 안에 argument들을 가질 수 있다.
  • 단독으로 사용될 수 없으며, 메쏘드 호출(method invocation) 바로 뒤에 나와야만 한다.
  1. invocation do |arg|
  2. end
  • 메쏘드 안에서 yield 를 이용해서 code block을 수행할 수 있다.
  • code block이 주어진 경우 메쏘드의 마지막 파라미터로 code block을 얻어올 수 있다. 또한 Proc#call을 이용해서 블록을 수행할 수 있다.
  1. def invocation *args, &block
  2. block.call

  3. yield

  4. end
  • closuer 로 동작한다.(블록이 정의된 부분의 환경(예를 들면 메쏘드 안의 변수)을 기억한다.)
  • 코드의 수행이 지연된다. yield 혹은 Proc#call 이 불려지는 시점에서 코드가 수행된다.

 

Proc

  • code block은 Proc.new 나 Kernel#proc을 이용해서 Proc 클래스의 객체로 변환된다. 위에서 메쏘드의 마지막 파라미터로 전해지는 것도 Proc 객체이다.
  • Proc 객체의 code block은 Proc#call을 이용해 실행할 수 있다.

 

 

이 글은 스프링노트에서 작성되었습니다.