Ruby:将 proc 转换为 lambda?

标签 ruby lambda proc-object

是否可以将 proc 风格的 Proc 转换为 lambda 风格的 Proc?

有点惊讶这行不通,至少在 1.9.2 中是这样:

my_proc = proc {|x| x}
my_lambda = lambda &p
my_lambda.lambda? # => false!

最佳答案

追踪这个有点棘手。查看 Proc#lambda? for 1.9 的文档,关于 proclamdba 之间的区别有相当长的讨论。

归根结底,lambda 会强制执行正确数量的参数,而 proc 则不会。从该文档中,此示例显示了将 proc 转换为 lambda 的唯一方法:

define_method always defines a method without the tricks, even if a non-lambda Proc object is given. This is the only exception which the tricks are not preserved.

 class C
   define_method(:e, &proc {})
 end
 C.new.e(1,2)       => ArgumentError
 C.new.method(:e).to_proc.lambda?   => true

如果你想避免污染任何类,你可以只在匿名对象上定义一个单例方法,以便将 proc 强制转换为 lambda:

def convert_to_lambda &block
  obj = Object.new
  obj.define_singleton_method(:_, &block)
  return obj.method(:_).to_proc
end

p = Proc.new {}
puts p.lambda? # false
puts(convert_to_lambda(&p).lambda?) # true

puts(convert_to_lambda(&(lambda {})).lambda?) # true

关于Ruby:将 proc 转换为 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2946603/

相关文章:

ruby-on-rails - Rails 模型字段列表

ruby - Cocoapod安装后直接获取主工程

java - Platform.exit() 在 JavaFX 的无限循环中无效

ruby - 如何在 Ruby 中编码 lambda (Proc)?

TCL - 返回变量与 upvar 并修改

ruby - 这是 Method#to_proc 中的错误吗? ( ruby 1.8.7)

ruby-on-rails - 什么是 "common"在日志中仅显示一次消息的实践/技术?

ruby - Padrino 项目生成器失败 - 未定义方法 `add_builtin_type'

javascript - 如何使用 Lambda 函数将 nodemailer 连接到 Vue.js 和 Netlify 应用程序

python - Python 中具有 3 个参数的 Lambda 函数