为啥我应该使用 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 不报错?