为啥我应该使用 lambda/proc ?解释它的重要性 [重复]

Posted

技术标签:

【中文标题】为啥我应该使用 lambda/proc ?解释它的重要性 [重复]【英文标题】:Why should I use lambda/proc ?Explain it's importance [duplicate]为什么我应该使用 lambda/proc ?解释它的重要性 [重复] 【发布时间】:2015-01-08 12:38:31 【问题描述】:

我是 ruby​​ 的新手,在学习它时我不理解 lambdas 或 procs 的概念。我知道 lambda 和 proc 是绑定到一组局部变量的代码块。但我不明白它们的用途。

所以

程序员从中得到什么好处?

我以前问过这个问题,被标记为重复,并得到了一个完全不相关的链接,所以请在将其标记为重复或责骂我之前,请先查看其他链接的答案。

【问题讨论】:

问题是在 SO 上有 许多 帖子解释什么是 procs 和 lambdas 以及它们是如何工作的,所以您可能会在这里遇到同样的问题。鉴于其措辞,程序员从中获得什么优势?这个问题很难回答,但可以通过this answer 或this one 之类的方式回答。 您能指出一些您认为人们过去错误指出的线程吗?关于优势,我看到一些代码将 lambdas 作为变量传递给最后时刻调用,有点像一种奇怪的惰性求值形式(尽管实际上它不是惰性求值) @BookOfGreg 这是一个线程***.com/questions/11581308/…,我认为答案无关紧要,因为它只指出了我现在不关心的区别 你的问题太宽泛了,已经回答了很多次了。如果您认为以前的答案没有涵盖您想了解的具体内容,那么您可以提出非常具体的问题,以明确您的问题有何不同。 @the Tin Man 我在我的问题中提到,程序员使用它有什么好处? 【参考方案1】:

这是一个广泛的问题。您基本上是在问“为什么闭包很重要?”。我想到的两个用途是:

免责声明:我实际上并没有运行任何这段代码,但它应该明白这一点。

    延迟执行代码。如果我想将一些代码作为回调传递(例如 Rails 的after_create),我可以使用闭包通过传递一个块来“挂钩”到 Rails。该块具有当前类的上下文,但在 Rails 允许之前它不需要运行。

    class SuperClass
      def self.after_create(&block)
        @__after_create = block
      end
    
      def self.create
        # do normal create logic
        instance = self.new
        if @__after_create
          @__after_create.call(instance)
        end
      end
    end
    
    class MyClass < SuperClass
      after_create |instance| instance.log
    
      def log
        puts 'hello world!'
      end
    end
    
    MyClass.create
    

    将函数作为参数传递。这使得编写通用树遍历算法之类的事情变得更容易,该算法只需将树的每个节点传递给某个函数:

    def Tree.elements
      ["hello", "world!"]
    end
    
    def Tree.traverse(&block)
      elements.each |el| block.call(el)
    end
    
    Tree.traverse |el| puts el # "hello" "world!"
    Tree.traverse |el| puts el.size # "5" "6"
    

【讨论】:

def Tree.elements 不以end 终止。 @theTinMan 已修复,谢谢!

以上是关于为啥我应该使用 lambda/proc ?解释它的重要性 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

当它的目标应该被删除时,为啥这个智能指针会给出正确的结果?

为啥要使用全局解释器锁?

为啥在 __assume 中使用函数调用时 MSVC 不报错?

为啥片段类应该是公开的?

如果 Interlocked.Increment 是原子的,为啥我应该使用 ++ 代替?

FormControl 是做啥用的?为啥使用它?应该如何使用?