Spec-Zone.ru › Crystal

Proc

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

# A proc without parameters
->{ 1 } # Proc(Int32)

# A proc with one parameters
->(x : Int32) { x.to_s } # Proc(Int32, String)

# A proc with two parameters
->(x : Int32, y : Int32) { x + y } # Proc(Int32, Int32, Int32)

Типы параметров обязательны, за исключением случаев, когда литерал proc напрямую передаётся в lib fun в привязках C.

Тип возвращаемого значения выводится из тела proc.

Также доступен специальный метод new:

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

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

Тип Proc

Чтобы указать тип Proc, можно написать:

# A Proc accepting a single Int32 argument and returning a String
Proc(Int32, String)

# A proc accepting no arguments and returning Nil
Proc(Nil)

# A proc accepting two arguments (one Int32 and one String) and returning a Char
Proc(Int32, String, Char)

В ограничениях типов, аргументах обобщённых типов и других местах, где ожидается тип, можно использовать сокращённый синтаксис, описанный в разделе типов:

# An array of Proc(Int32, String, Char)
Array(Int32, String -> Char)

Вызов

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

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

Для proc можно также указать получателя:

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

To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/syntax_and_semantics/literals/proc.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API