什么时候你会使用其中一种而不是另一种?
当前回答
一篇关于ruby指南:blocks, procs和lambdas的有用文章
Procs从当前方法返回,而lambdas从lambda本身返回。 Procs不关心参数的正确数量,而lambdas则会引发异常。
其他回答
一般来说,lambda比procs更直观,因为它们 更类似于方法。他们对arity要求很严格,他们只是 当你调用return时退出。由于这个原因,许多ruby开发者使用lambdas作为 首选,除非他们需要procs的特定功能。
Procs: Proc类的对象。像块一样,它们在作用域中进行计算 它们被定义的地方。 Lambdas:同样是Proc类的对象,但与常规procs略有不同。 它们像block和procs一样是闭包,因此它们被求值 定义它们的范围。
创建过程
a = Proc.new { |x| x 2 }
创建λ
B = lambda {|x| x 2}
一个不同之处在于它们处理参数的方式。使用proc{}和proc .new{}创建proc是等价的。但是,使用lambda{}提供了一个检查传递给它的参数数量的过程。从ri Kernel#lambda:
等价于Proc.new,除了结果Proc对象检查调用时传递的参数数量。
一个例子:
p = Proc.new {|a, b| puts a**2+b**2 } # => #<Proc:0x3c7d28@(irb):1>
p.call 1, 2 # => 5
p.call 1 # => NoMethodError: undefined method `**' for nil:NilClass
p.call 1, 2, 3 # => 5
l = lambda {|a, b| puts a**2+b**2 } # => #<Proc:0x15016c@(irb):5 (lambda)>
l.call 1, 2 # => 5
l.call 1 # => ArgumentError: wrong number of arguments (1 for 2)
l.call 1, 2, 3 # => ArgumentError: wrong number of arguments (3 for 2)
此外,正如Ken指出的那样,在lambda中使用return将返回该lambda的值,而在proc中使用return则从外围块返回。
lambda { return :foo }.call # => :foo
return # => LocalJumpError: unexpected return
Proc.new { return :foo }.call # => LocalJumpError: unexpected return
因此,对于大多数快速使用,它们是相同的,但如果您希望自动严格参数检查(有时也可以帮助调试),或者如果您需要使用return语句来返回proc的值,请使用lambda。
procs和lambdas之间的真正区别在于控制流关键字。我说的是return, raise, break, redo, retry等等——这些控制词。假设你在一个proc中有一个return语句。当你调用你的proc时,它不仅会把你从它里面转储出去,而且还会从封闭的方法中返回,例如:
def my_method
puts "before proc"
my_proc = Proc.new do
puts "inside proc"
return
end
my_proc.call
puts "after proc"
end
my_method
shoaib@shoaib-ubuntu-vm:~/tmp$ ruby a.rb
before proc
inside proc
final函数放入方法中,从未执行过,因为当我们调用proc时,它的return函数将我们从方法中丢弃。然而,如果我们将proc转换为lambda,我们会得到以下结果:
def my_method
puts "before proc"
my_proc = lambda do
puts "inside proc"
return
end
my_proc.call
puts "after proc"
end
my_method
shoaib@shoaib-ubuntu-vm:~/tmp$ ruby a.rb
before proc
inside proc
after proc
lambda内部的返回值只是将我们从lambda本身中转储出来,而封闭的方法继续执行。在procs和lambdas中处理控制流关键字的方式是它们之间的主要区别
一篇关于ruby指南:blocks, procs和lambdas的有用文章
Procs从当前方法返回,而lambdas从lambda本身返回。 Procs不关心参数的正确数量,而lambdas则会引发异常。
proc和lambda之间的区别在于,proc只是一份代码的副本,参数被依次替换,而lambda则像其他语言一样是一个函数。(返回行为,参数检查)
推荐文章
- 在Ruby中不创建新字符串而修饰字符串的规范方法是什么?
- RVM不是一个函数,用' RVM use…’不会起作用
- 了解Gemfile。锁文件
- 如何确定一个数组是否包含另一个数组的所有元素
- 是什么导致这个ActiveRecord::ReadOnlyRecord错误?
- 最好的打印散列的方法
- Rails:dependent =>:destroy VS:dependent =>:delete_all
- 我可以在不包含Ruby模块的情况下调用实例方法吗?
- 如何将新项目添加到哈希
- 测试一个Ruby类是否是另一个类的子类
- 什么时候使用Struct vs. OpenStruct?
- 数组到哈希Ruby
- 我如何让红宝石打印一个完整的回溯而不是截断一个?
- 如何使用RSpec的should_raise与任何类型的异常?
- 如何创建退出消息