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

标签 ruby metaprogramming

有什么方法可以持久化 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/

相关文章:

ruby-on-rails - 获取运行时错误 : "In order to use #url_for, you must include routing helpers explicitly" when I've already included them

编译时的 C++ 展开循环

c++ - CPP 元编程 : contains function for tuples

reflection - 在 Common Lisp 中拦截和修改用户输入

ruby-on-rails - 使用上帝监控 unicorn - 以非零代码开始退出 = 1

ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别?

ruby-on-rails - Ruby on Rails RSpec 错误:Encoding::UndefinedConversionErrors

javascript - 拦截 JavaScript 数组访问器

c++ - 嵌套概念多态模板

ruby - (LoadError) 没有要加载的文件 -- jruby/java