作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
有没有办法将 RubyVM::InstructionSequence 存储到文件中并稍后读取?
我尝试了 Marshal.dump
但没有成功。我收到以下错误:
`dump': no _dump_data is defined for class RubyVM::InstructionSequence (TypeError)
最佳答案
是的,有办法。
首先,您需要使 InstructionSequence
的 load
方法可访问,默认情况下该方法是禁用的:
require 'fiddle'
class RubyVM::InstructionSequence
# Retrieve Ruby Core's C-ext `iseq_load' function address
load_fn_addr = Fiddle::Handle::DEFAULT['rb_iseq_load']
# Retrieve `iseq_load' C function representation
load_fn = Fiddle::Function.new(load_fn_addr,
[Fiddle::TYPE_VOIDP] * 3,
Fiddle::TYPE_VOIDP)
# Make `iseq_load' accessible as `load' class method
define_singleton_method(:load) do |data, parent = nil, opt = nil|
load_fn.call(Fiddle.dlwrap(data), parent, opt).to_value
end
end
因为 RubyVM::InstructionSequence.load
方法可以将编译后的 VM 指令作为数组加载,您可以自由地将其用于(反)序列化目的:
irb> # compile simple ruby program into its instruction sequence
irb> seq = RubyVM::InstructionSequence.new <<-EOS
irb: p 'Hello, world !'
irb: EOS
=> <RubyVM::InstructionSequence:<compiled>@<compiled>
irb> # serialize sequence as Array instance representation
irb> data = Marshal.dump seq.to_a
=> "\x04\b[\x13\"-YARVInstructionSequence/SimpleDataFormat … ]"
irb> # de-serialize previously serialized sequence
irb> seq_loaded = Marshal.load data
=> ["YARVInstructionSequence/SimpleDataFormat", 2, 2, 1, { … ]
irb> # load deserialized Array back into instruction sequence
irb> new_iseq = RubyVM::InstructionSequence.load seq_loaded
=> <RubyVM::InstructionSequence:<compiled>@<compiled>>
irb> # execute instruction sequence in current context
irb> new_iseq.eval
"Hello, world !"
=> "Hello, world !"
这就是所有人 ;)
关于ruby - 如何存储和读取 RubyVM::InstructionSequence?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562292/
有没有办法将 RubyVM::InstructionSequence 存储到文件中并稍后读取? 我尝试了 Marshal.dump 但没有成功。我收到以下错误: `dump': no _dump_da
在 Ruby 1.9 中,YARV-VM 被合并到 Ruby 中。所以http://www.atdot.net/yarv似乎已经过时了。 在哪里可以找到有关 RubyVM::InstructionSe
我是一名优秀的程序员,十分优秀!