我希望能够运行 lambda 并获取其参数值(下面 a
和 b
的值)。
我可以通过显式让 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 外部获取 a
和 b
值?
(为了提供上下文——我问是因为我已经 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/