我在组织的网站上阅读了关于水晶语言书中的Procs的文档 . 什么是proc?我得到你定义参数和返回类型,并使用调用方法来调用proc,这让我觉得它是一个函数 . 但为什么要使用proc?它是为了什么?
您不能将方法传递给其他方法(但您可以将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
一个强大的功能是将块转换为Proc并将其传递给方法,因此您可以forward it:
def int_to_int(&block : Int32 -> Int32) block end proc = int_to_int { |x| x + 1 } proc.call(1) #=> 2
另外,正如@JohannesMüller评论的那样,Proc可以用作closure:
def minus(num) ->(n : Int32) { num - n } end minus_20 = minus(20) minus_20.call(7) # => 13
语言参考实际上很好地解释了Proc:
Proc表示带有可选上下文的函数指针(闭包数据) .
所以是的,proc基本上就像一个函数 . 与普通块相比,它基本上保存了对块的引用,因此可以存储和传递它,并提供闭包 .
Proc只是一个没有名字的函数/方法 . 你可以将它作为变量传递,它可以引用它的封闭范围中的变量(它是一个闭包) . 它们通常用作将方法块作为变量传递的方法 .
3 回答
您不能将方法传递给其他方法(但您可以将proc传递给方法),并且方法不能返回其他方法(但它们可以返回proc) .
Proc还从已定义的范围中捕获变量:
一个强大的功能是将块转换为Proc并将其传递给方法,因此您可以forward it:
另外,正如@JohannesMüller评论的那样,Proc可以用作closure:
语言参考实际上很好地解释了Proc:
所以是的,proc基本上就像一个函数 . 与普通块相比,它基本上保存了对块的引用,因此可以存储和传递它,并提供闭包 .
Proc只是一个没有名字的函数/方法 . 你可以将它作为变量传递,它可以引用它的封闭范围中的变量(它是一个闭包) . 它们通常用作将方法块作为变量传递的方法 .