Язык программирования Crystal

Proc

Proc (процедурв) представляет собой указатель на функцию с дополнительный контекстом (данные замыкания). Обычно создается с помощью специального литерала:

# процедура без аргументов:
->{ 1 } # Proc(Int32)

# процедура с одним аргументом:
->(x : Int32) { x.to_s } # Proc(Int32, String)

# процедура с двумя аргументами:
->(x : Int32, y : Int32) { x + y } # Proc(Int32, Int32, Int32)

Типы аргументов являются обязательными, за исключением случаев, когда литерал процедуры напрямую передается в lib fun для вызова функций из языка С.

Возвращаемый тип определяется из тела процедуры.

Предоставляется специальный метод new:

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

Эта форма позволяет явно определять тип возвращаемого значения и сравнивать его с возвращаемым типом процедуры.

Вызов

Чтобы вызвать Proc, просто выполните метод call. Число аргументов должно соответствовать явно определенным аргументам процедуры:

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

Из метода

Proc может быть создан из существующего метода:

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