什么时候你会使用其中一个而不是另一个?

推荐答案

一个区别在于他们处理争论的方式.使用proc {}Proc.new {}创建过程是等效的.但是,使用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)

此外,正如肯指出的,在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.

Ruby相关问答推荐

Ruby中链表大小调用的时间复杂度

仅在模块中列出方法?

如何在加载文件时禁用重新定义常量的警告

Ruby $:.unshift File.dirname(__FILE__)

方法应该以 (?问号)结尾吗?只返回一个布尔值?

带有索引的 Ruby `each_with_object`

Ruby - net/http - 重定向

使用正则表达式在第一个逗号之前提取文本

可可豆荚安装在iOS项目上不起​​作用

Ruby 1.9 - 无效的多字节字符(US-ASCII)

获取Ruby中数组的差异

迭代一个数组,一次 n 项

在 Ruby 中定义 [方括号] 方法是如何工作的?

无法将 RVM 安装的 Ruby 与 sudo 一起使用

如何使用 RVM 更新 Ruby 解释器?

野外的好黄瓜例子?

如何在 Ruby 中做标准差?

OpenSSL vs GPG 用于加密异地备份?

让 sidekiq 立即执行作业(job)

Ruby:从 Ruby 中的变量创建哈希键和值