Proc

Proc은 함수 포인터를 나타내며, 실행 맥락 정보(클로저 데이터)를 포함할 수 있습니다. 보통 프록 리터럴을 통해 생성합니다.

# 인자 없는 프록
->{ 1 } # Proc(Int32)

# 인자가 하나인 프록
->(x : Int32) { x.to_s } # Proc(Int32, String)

# 인자가 두 개인 프록
->(x : Int32, y : Int32) { x + y } # Proc(Int32, Int32, Int32)

C 바인딩의 fun에 프록 리터럴을 바로 보내는 경우가 아니라면 인자의 타입을 반드시 적어주어야 합니다.

반환형은 프록의 본체로부터 추론됩니다.

특수한 new 메서드 또한 사용할 수 있습니다.

Proc(Int32, String).new { |x| x.to_s } # Proc(Int32, String)

이 형태를 통해 반환형을 명시하여 프록 본체의 반환형을 검사할 수 있습니다.

프록의 타입

다음과 같이 프록의 타입을 표기할 수 있습니다.

# Int32 인자를 하나 받아 String을 반환하는 프록
Proc(Int32, String)

# 인자 없이 Void를 반환하는 프록
Proc(Void)

# Int32와 String의 두 인자를 받아 Char를 반환하는 프록
Proc(Int32, String, Char)

타입 제약, 제너릭 타입 인자, 그 외 타입을 써야 하는 경우에는 타입 문법에 설명된 대로 더 짧은 문법을 사용할 수도 있습니다.

# Proc(Int32, String, Char)의 배열
Array(Int32, String -> Char)

호출

call 메서드를 호출하여 프록을 호출합니다. 인자의 수는 프록의 타입과 일치해야 합니다.

proc = ->(x : Int32, y : Int32) { x + y }
proc.call(1, 2) #=> 3

메서드로부터

프록은 기존 메서드로부터 생성할 수 있습니다.

def one
  1
end

proc = ->one
proc.call #=> 1

메서드에 인자가 있다면 반드시 그 타입을 명시해야 합니다.

def plus_one(x)
  x + 1
end

proc = ->plus_one(Int32)
proc.call(41) #=> 42

또한 프록의 리시버를 특정해줄 수도 있습니다.

str = "hello"
proc = ->str.count(Char)
proc.call('e') #=> 1
proc.call('l') #=> 2

results matching ""

    No results matching ""