gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:42:20 26 4
gpt4 key购买 nike

我希望能够运行 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com