Proc¶
一个 Proc 表示一个函数指针,带有可选的上下文(闭包数据)。它通常用 proc 字面量创建
# A proc without parameters
->{ 1 } # Proc(Int32)
# A proc with one parameter
->(x : Int32) { x.to_s } # Proc(Int32, String)
# A proc with two parameters
->(x : Int32, y : Int32) { x + y } # Proc(Int32, Int32, Int32)
参数的类型是必须的,除非将 proc 字面量直接发送到 C 绑定中的 lib fun
。
返回值类型是从 proc 的主体推断出来的,但也可以显式提供
# A proc returning an Int32 or String
-> : Int32 | String { 1 } # Proc(Int32 | String)
# A proc with one parameter and returning Nil
->(x : Array(String)) : Nil { x.delete("foo") } # Proc(Array(String), Nil)
# The return type must match the proc's body
->(x : Int32) : Bool { x.to_s } # Error: expected Proc to return Bool, not String
还提供了一个 new
方法,它从一个 捕获的块 创建一个 Proc
。此形式主要在使用 别名 时有用
Proc(Int32, String).new { |x| x.to_s } # Proc(Int32, String)
alias Foo = Int32 -> String
Foo.new { |x| x.to_s } # same proc as above
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