【发布时间】:2018-03-15 05:21:03
【问题描述】:
我阅读了组织网站上 Crystal Language 书籍中有关 Procs 的文档。 proc到底是什么?我知道您定义了参数和返回类型并使用调用方法来调用 proc,这让我认为它是一个函数。但为什么要使用 proc?有什么用?
【问题讨论】:
标签: crystal-lang
我阅读了组织网站上 Crystal Language 书籍中有关 Procs 的文档。 proc到底是什么?我知道您定义了参数和返回类型并使用调用方法来调用 proc,这让我认为它是一个函数。但为什么要使用 proc?有什么用?
【问题讨论】:
标签: crystal-lang
你不能将方法传递给其他方法(但你可以将procs传递给方法),并且方法不能返回其他方法(但它们可以返回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并将其传递给方法,因此您可以forward it:
def int_to_int(&block : Int32 -> Int32)
block
end
proc = int_to_int { |x| x + 1 }
proc.call(1) #=> 2
另外,正如@Johannes Müller 所说,Proc 可以用作closure:
def minus(num)
->(n : Int32) { num - n }
end
minus_20 = minus(20)
minus_20.call(7) # => 13
【讨论】:
yield)。块的强大之处在于它可以被存储(例如在实例变量中)并形成一个闭包。
Proc 只是一个没有名称的函数/方法。您可以将它作为变量传递,它可以引用其封闭范围内的变量(它是一个闭包)。它们通常用作将方法块作为变量传递的一种方式。
【讨论】: