我很难想象在网络应用程序中实际使用Procs和Lambdas。有没有人在你的代码中有一个情况的例子,它们派上用场了?
答案 0 :(得分:5)
为什么特别是在webapps中呢?你的意思是Ruby on Rails框架吗?
当您想要匿名存储代码时,Procs和lambdas非常有用。 Procs和lambdas与方法非常相似,只是它们没有名称。在ActiveRecord / Rails中用一个很好的例子来说明这一点:
// methods are named
validates_presence_of :foo, :if => :active?
// procs aren't
validates_presence_of :foo, :if => proc {|r| do_stuff }
我很常见,procs用于回调和钩子,所以你不必编写命名方法并引用它们,将代码直接放在选项哈希等中。
您可能会发现this article有用。
答案 1 :(得分:3)
我在命名范围内使用它们:
named_scope:last,lambda {| quantity | {:order => “created_at DESC”,:limit =>数量}}
创建一个简单的方法来获取最后一个NUMBER帖子,评论等
现在,我有点欺骗,它是一个框架而不是“网络应用程序”,但我不能认为网络应用程序与其他桌面应用程序不同。 Procs和Lambdas都允许您“保存”代码供以后使用,并且可以帮助使用行为,使用更多“面向领域”的方法并清理更多“常规代码”
答案 2 :(得分:1)
使用lambda或proc是一种称为函数式编程的编程风格。 Rails中有几个接口,您可能希望传递一个块对象(lambda或procc),就像validations一样:
class Person < ActiveRecord::Base
validates_acceptance_of :terms_of_service :if => Proc.new { |user| user.signup_step > 2 }
end
你可以设计一些这样的接口,你可以让用户选择传递方法名称(符号)或proc(或lambda)对象来指定一些逻辑。
例如,Rails中的另一个地方是您可以动态设置layouts的地方:
class WeblogController < ActionController::Base
layout proc{ |controller| current_user.logged_in? ? "writer_layout" : "reader_layout" }
end
答案 3 :(得分:1)
显然,procs和lambdas是与回调相关的任何东西的必要组成部分,但在大多数情况下,在ruby中,这可以用块来完成。
procs或lambdas与回调无关的地方就像编译正则表达式一样。当然,正则表达式是语言的一部分,所以你不需要为此进行过程,但你可能会发现自己正在编写一些其他类型的程序,这些程序具有可以重复使用的一次性成本,但实际上并不值得创建一个完整的课程。
就我而言,我有一个包含字符串列表的对象(publist)。在代码的一个区域中,我需要反复检查其他组是否在该列表中有任何成员。如果更改数据类型以使对象包含集合,那将会很不方便并且性能很差。所以我所做的是创建一个返回匹配器lambda的方法,该方法具有此列表的本地集合表示。
我本可以返回一个集合,但逻辑上匹配的项目是否属于publist的业务逻辑。我可以在将来改变它来支持子串或正则表达式,匹配器的用户仍然会有相同的api。