我在组织网站上的 Crystal Language 书中阅读了有关 Procs 的文档。proc 究竟是什么?我知道您定义了参数和返回类型并使用 call 方法来调用 proc,这让我认为它是一个函数。但是为什么要使用 proc?它是做什么用的?
您不能将方法传递给其他方法(但您可以将过程传递给方法),并且方法不能返回其他方法(但它们可以返回过程)。
Proc 还从定义它的范围中捕获变量:
a = 1
b = 2
proc = ->{ a + b }
def foo(proc)
bar(proc)
end
def bar(proc)
a = 5
b = 6
1 + proc.call
end
puts bar(proc) # => 4
Run Code Online (Sandbox Code Playgroud)
一个强大的功能是将块转换为 Proc 并将其传递给方法,因此您可以转发它:
def int_to_int(&block : Int32 -> Int32)
block
end
proc = int_to_int { |x| x + 1 }
proc.call(1) #=> 2
Run Code Online (Sandbox Code Playgroud)
此外,正如@Johannes Müller 所评论的,Proc 可以用作闭包:
def minus(num)
->(n : Int32) { num - n }
end
minus_20 = minus(20)
minus_20.call(7) # => 13
Run Code Online (Sandbox Code Playgroud)