我在组织网站上的水晶语言书中阅读了有关Procs的文档。究竟什么是过程?我知道您定义了参数和返回类型,并使用调用方法来调用proc,这让我认为它是一个函数。但是为什么要使用过程呢?这是干什么用的?
您不能将方法传递到其他方法中(但可以将 procs 传递到方法中(,并且方法不能返回其他方法(但它们可以返回过程(。
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
一个强大的功能是将块转换为 Proc 并将其传递给方法,以便您可以转发它:
def int_to_int(&block : Int32 -> Int32)
block
end
proc = int_to_int { |x| x + 1 }
proc.call(1) #=> 2
此外,正如 @Johannes Müller 评论的那样,Proc 可以用作闭包:
def minus(num)
->(n : Int32) { num - n }
end
minus_20 = minus(20)
minus_20.call(7) # => 13
语言参考实际上很好地解释了Proc:
Proc 表示具有可选上下文(闭包数据(的函数指针。
所以是的,proc 本质上就像一个函数。与普通块相比,它本质上包含对块的引用,因此可以存储和传递,并提供闭包。
Proc 只是一个没有名称的函数/方法。你可以把它作为一个变量传递,它可以引用它的封闭作用域中的变量(它是一个闭包(。它们通常用作将方法块作为变量传递的一种方式。