什么是Crystal Lang的触发器?

时间:2018-03-15 05:21:04

标签: crystal-lang

我在组织的网站上阅读了关于水晶语言书中的Procs的文档。什么是proc?我得到你定义参数和返回类型,并使用调用方法来调用proc,这让我觉得它是一个函数。但为什么要使用proc?它的用途是什么?

3 个答案:

答案 0 :(得分:3)

你不能将方法传递给其他方法(但你可以将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

答案 1 :(得分:2)

语言参考实际上很好地解释了Proc

  

Proc表示带有可选上下文的函数指针(闭包数据)。

所以是的,proc基本上就像一个函数。与普通块相比,它基本上保存了对块的引用,因此可以存储和传递它,并提供闭包。

答案 2 :(得分:1)

Proc只是一个没有名字的函数/方法。你可以将它作为变量传递,它可以引用它的封闭范围内的变量(它是一个闭包)。它们通常用作将方法块作为变量传递的方法。