【问题标题】:What is a proc in Crystal Lang?Crystal Lang 中的 proc 是什么?
【发布时间】:2018-03-15 05:21:03
【问题描述】:

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

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

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

    【讨论】:

    • 关于块转发的例子并不是很好,因为它实际上并没有使用 Proc 的独特功能。你可以对一个普通的块做同样的事情(使用yield)。块的强大之处在于它可以被存储(例如在实例变量中)并形成一个闭包。
    • @JohannesMüller,谢谢,我已经更新了答案。
    • 顺便说一句,您也可以使用 proc 方法,请参阅:stackoverflow.com/a/46728999/7450793
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 1970-01-01
        相关资源
        最近更新 更多