我希望能够运行lambda并获得它的参数值(下面的值为ab).

我可以通过显式地让lambda返回binding,然后从这个绑定中获取值来实现这一点:

fun = lambda { |a, b = Time.now| binding }
fun_binding = fun.call(123)
puts "A is #{fun_binding.local_variable_get(:a)} and B is #{fun_binding.local_variable_get(:b)}"
# Outputs e.g.: A is 123 and B is 2022-04-29 20:14:07 +0200

不在lambda体中运行任何代码就可以获得这些值吗?我能做什么

fun = lambda { |a, b = Time.now| }
fun.call(123)

还是从lambda之外得到ab的值?

(为了提供上下文——我这么问是因为我已经把它作为一种快捷语法,用于实例化自动分配了IVAR/读卡器的对象.在这个阶段,我更好奇什么是可能的,而不是什么是可取的——所以我邀请任何解决方案,无论是可取的还是不可取的……)

推荐答案

我不确定这有多明智,但您可以使用TracePoint类和:b_call事件来获取lambda的绑定:

fun = lambda { |a, b = Time.now| }

fun_binding = nil
TracePoint.trace(:b_call) do |tp|
    fun_binding = tp.binding
    tp.disable
end

fun.call(123)

puts "A is #{fun_binding.local_variable_get(:a)} and B is #{fun_binding.local_variable_get(:b)}"

这不是一个完美的解决方案,如果其中一个参数的默认值自己进入一个块,它就会失败(因为默认值是在为lambda触发:b_call事件之前计算的),但这可以通过TracePoint处理程序中的一些额外过滤来修复.

Ruby相关问答推荐

Ruby:程序终止后仅写入/保存/可见的文件数据

如何用 yield_self 断链

设计登录根路由rails 3

RVM 和 OpenSSL 的问题

你如何称呼 Ruby 中的 &: 运算符?

为什么安全导航比在 Rails 中使用 try 更好?

ruby中字符的整数值?

在 gem 中放置/访问配置文件的位置?

无法在 Heroku 教程中使用 Python 启动工头

Ruby:如何计算相对于另一个路径的路径?

出于调试目的,如何打印有关 NET:HTTPRequest 的信息?

创建一个哈希值作为数组和默认值作为空数组

与 String 相比,在 Ruby 中使用 StringIO 有哪些优势?

我可以使用 `else if` 而不是 `elsif` 吗?

在 Ruby 中将散列扁平化为字符串

在 Ruby 中按名称获取一个类?

Ruby 1.9 哈希,键中有破折号

野外的好黄瓜例子?

获取当前 ruby​​ 进程内存使用情况

如何使用 Ruby 运行命令五次?