Techioz Blog

Rubyで生成されたバイトコードを実行するにはどうすればよいですか?

概要

私は Ruby スクリプト言語を初めて使用します。

私はRubyでバイトコードを生成する方法を学んでいました。 バイトコードを生成するための答えを見つけました。

しかし、生成されたバイトコードを実行する方法がわかりません。インターネットで検索しましたが、これに対する答えは見つかりませんでした。

バイトコードの生成:-

puts RubyVM::InstructionSequence.compile("x = 50; x > 100 ? 'foo' : 'bar'").disassemble

出力は、

== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1] s1)
[ 2] x          
0000 trace            1                                               (   1)
0002 putobject        50
0004 setlocal         x
0006 trace            1
0008 getlocal         x
0010 putobject        100
0012 opt_gt           <ic:1>
0014 branchunless     20
0016 putstring        "foo"
0018 leave            
0019 pop              
0020 putstring        "bar"
0022 leave            

生成されたバイトコードを使用して同じスクリプトを実行する方法がわかりません。

誰かこれを実行する方法を教えてください。

前もって感謝します!

解決策

TL;DR; .eval メソッドを探しています。

.compile メソッドは RubyVM::structSequence クラスのインスタンスを返します。このクラスには、「コンパイルされた」命令を評価/実行する .eval メソッドがあります。

iseq = RubyVM::InstructionSequence.compile("x = 50; x > 100 ? 'foo' : 'bar'")    
iseq.eval       # => "bar"

または、ワンライナー:

RubyVM::InstructionSequence.compile("x = 50; x > 100 ? 'foo' : 'bar'").eval