gpt4 book ai didi

ruby - 坚持 ruby​​ 绑定(bind)

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:27 24 4
gpt4 key购买 nike

有什么方法可以持久化 ruby​​ 绑定(bind)吗?我无法使用 marshal.dump。医生说

if the objects to be dumped include bindings, procedure or method objects, instances of class IO, or singleton objects, a TypeError will be raised.

我们需要在多个请求中使用相同的绑定(bind)。我如何序列化/反序列化 ruby​​ 绑定(bind)?

最佳答案

序列化绑定(bind)的想法在很多方面都是不连贯的,因为绑定(bind)与运行时堆栈密切相关;当您反序列化绑定(bind)时,它是否也应该重新创建堆栈?

就是说,如果您只想从绑定(bind)中获取,您可以使用如下方法:

class Binding
def values_for_serialization
data = {
locals: {},
self: eval('self',self)
}
eval("local_variables",self).each do |lvar|
data[:locals][lvar] = local_variable_get(lvar)
end
data
end
end

然后您可以使用 Marshal#dumpto_yaml 或其他任何方式序列化返回的结构。

反序列化会像这样工作:

class Binding
def self.from_values(values)
bind = values[:self].instance_exec { binding }
values[:locals].each_pair do |lvar,value|
bind.local_variable_set(lvar,value)
end
bind
end
end

但请注意,虽然这会给您一个 绑定(bind),它具有适当的自身对象和适当的局部变量,但它并不是真正的相同 绑定(bind)。例如,如果您尝试使用它来序列化顶级脚本绑定(bind),您可以;然后在另一个脚本中你可以反序列化它。但是当您这样做时,局部变量将在该脚本的顶级绑定(bind)中可用,它们仅在您创建的绑定(bind)对象中可用。

关于ruby - 坚持 ruby​​ 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38617396/

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