반응형
그냥 블록이라고 해도 되는지 모르겠습니다만...
irb(main):012:0> def calc(a,b)
irb(main):013:1> yield(a,b)
irb(main):014:1> end
=> nil
irb(main):015:0> calc(1,4){|a,b| puts a+b}
5
=> nil
irb(main):016:0> calc(2,3){|a,b| puts a*b}
6
=> nil
irb(main):013:1> yield(a,b)
irb(main):014:1> end
=> nil
irb(main):015:0> calc(1,4){|a,b| puts a+b}
5
=> nil
irb(main):016:0> calc(2,3){|a,b| puts a*b}
6
=> nil
매우 비 실용적인 예제 입니다만...우선 함수 calc 를 정의했습니다. 그리고 a,b 두 값을 넣었고요. 그다음에 yield 를 실행하게 됩니다 yield 는 무엇일까요?
그 아래 실제 calc 함수를 사용한 예를 보면 '{' 중괄호로 된 부분이 yield 에 삽입되어 실행된다고 생각하면 됩니다. c언어로 따진다면 함수의 포인터 정도로 생각하면 이해가 될까 싶네요.
위에서 만든 calc 함수를 이용해서 다음과 같은 더하기 함수를 만들수도 있을겁니다.
irb(main):017:0> def add(a,b)
irb(main):018:1> calc(a,b){|a,b| puts a+b}
irb(main):019:1> end
=> nil
irb(main):020:0> add(10,10)
20
irb(main):018:1> calc(a,b){|a,b| puts a+b}
irb(main):019:1> end
=> nil
irb(main):020:0> add(10,10)
20
사용하기에 따라선 여러가지로 사용할 수 있겠지요.
yield 를 사용하지 않고 직접 인자로 받아 사용할 수도 있습니다.
irb(main):023:0> def calc2(*args, &action)
irb(main):024:1> action.call(args)
irb(main):025:1> end
irb(main):024:1> action.call(args)
irb(main):025:1> end
action 이 바로 실제 수행될 코드를 가리킵니다. 이게 함수포인터와 더 비슷하다고 할 수 있겠네요. 이 경우는 call 명령으로 명시적으로 실행해 줍니다.
위에서 만든 calc2 함수는 이렇게 사용하면 됩니다.
irb(main):057:0> x=0
=> 0
irb(main):058:0> y=0
=> 0
irb(main):059:0> calc2(1,2,3,4,5){|a| a.each {|x| y+=x}}
=> [1, 2, 3, 4, 5]
irb(main):060:0> y
=> 15
=> 0
irb(main):058:0> y=0
=> 0
irb(main):059:0> calc2(1,2,3,4,5){|a| a.each {|x| y+=x}}
=> [1, 2, 3, 4, 5]
irb(main):060:0> y
=> 15
마지막으로 lambda 입니다.
pow = lambda{|a,b| puts a**b}
제곱을 구하는 pow 를 정의합니다.
다음과 같이 사용하면 됩니다.
irb(main):068:0> pow.call(4,2)
16
16
새삼스럽게 이야기 하자면 중괄호는 do~end 로 사용할 수 있습니다. 한줄일땐 중괄호({) 여러줄일땐 do~end 를 쓰면 되죠. 아래와 같이 말이죠.
irb(main):030:0> sum=lambda do |a|
irb(main):031:1* c=0
irb(main):032:1> a.each {|b| c=c+b}
irb(main):033:1> return c
irb(main):034:1> end
irb(main):031:1* c=0
irb(main):032:1> a.each {|b| c=c+b}
irb(main):033:1> return c
irb(main):034:1> end
사용방법은 당연히 똑 같습니다.
irb(main):039:0> sum.call(1..100)
=> 5050
irb(main):040:0> sum.call(1..1000)
=> 500500
=> 5050
irb(main):040:0> sum.call(1..1000)
=> 500500
'프로그래밍 > ruby' 카테고리의 다른 글
루비정리> 3. 클래스 (0) | 2009.06.25 |
---|---|
루비 정리> 2. 제어문과 반복문 (0) | 2009.06.18 |
루비 정리> 1. 자료형 (0) | 2009.06.13 |
객체지향 스크립트 언어 루비. (0) | 2008.01.25 |