Crystal Lang 中的 proc 是什么?

dki*_*mot 4 crystal-lang

我在组织网站上的 Crystal Language 书中阅读了有关 Procs 的文档。proc 究竟是什么?我知道您定义了参数和返回类型并使用 call 方法来调用 proc,这让我认为它是一个函数。但是为什么要使用 proc?它是做什么用的?

WPe*_*0EU 5

您不能将方法传递给其他方法(但您可以将过程传递给方法),并且方法不能返回其他方法(但它们可以返回过程)。

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)

  • 关于块转发的示例并不是很好,因为它实际上并没有使用 Proc 的独特功能。您可以对普通块执行相同的操作(使用“yield”)。块的强大之处在于它可以被存储(例如在一个实例变量中)并形成一个闭包。 (2认同)