ruby - 如何从外部获取给定 lambda 的参数值,而不显式返回其 `binding` ?

标签 ruby metaprogramming

我希望能够运行 lambda 并获取其参数值(下面 ab 的值)。

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

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 体内运行任何代码的情况下获取这些值? IE。我可以吗

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

仍然以某种方式从 lambda 外部获取 ab 值?

(为了提供上下文——我问是因为我已经 experimented 将其用作实例化对象的快捷语法,并自动分配 ivars/readers。在这个阶段,我对什么是可能的比什么是可取的更好奇– 所以我邀请任何解决方案,无论是否明智……)

最佳答案

我不确定这是否明智,但您可以使用 TracePoint使用 :b_call 事件类来获取 lambda 的绑定(bind):

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)}"

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

关于ruby - 如何从外部获取给定 lambda 的参数值,而不显式返回其 `binding` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72062159/

相关文章:

ruby - 更改 ruby​​ 方法上下文/使用 instance_exec 调用方法

ruby - 退出内核#loop

ruby-on-rails - 规范。如何检查对象方法是否被调用?

ruby-on-rails - 清除 Rails 中单元测试和功能测试之间的测试数据库 (factory_girl)

ruby-on-rails - Rails 关注点 : class method with block

c++ - 在 unsigned long long 上编译时间模板化 C++ 计算? double ?

c++ - 如何使用当前类模板作为另一个模板的模板参数?

ruby - 使用 Watir 获取该行第一个单元格中具有唯一文本的第二个表格单元格的值

ruby-on-rails - 从模型内部获取未保存的关联

Ruby 作用域方法值技术