2008-08-23 5 views
18

ジョー・ヴァン・ダイクasked the Ruby mailing listRubyでラムダ(Proc)をマーシャリングするにはどうすればよいですか?

こんにちは、

ルビーでは、私はあなたが右、ラムダ/ procのオブジェクトをマーシャリングすることはできませんと思いますか? lispや他の言語で が可能ですか?私がやろうとした何

l = lamda { ... } 
Bj.submit "/path/to/ruby/program", :stdin => Marshal.dump(l) 

だから、私は何をすべきかについて コンテキスト/コードを含む、ラムダオブジェクトをBackgroundJob送信しています。しかし、それは不可能であったと推測します。私は は、プログラムが実行された後に何をするための指示 を含む通常のルビーオブジェクトのマーシャリングを終了しました。

ジョー

答えて

20

を試してみてください。これは、両方ともクロージャとみなされます。つまり、クロージャが定義されたメモリを囲んで参照できます。 (マーシャリングするためには、作成時にアクセス可能なすべてのメモリをマーシャリングする必要があります)。

ガイウスが指摘したように、ruby2rubyを使用すると、プログラム。つまり、ルビコードを表す文字列をマーシャリングし、後でそれを再評価することができます。

+3

ruby​​2rubyはわずか1.8で動作し、まだ1.9のバイトコードをデシリアライズするための公式な方法は存在しません。 – manveru

+0

私はいくつかのプロジェクトの使用 "リッパー" 1.9と前に見た...あまりにも簡単に見えなかった... – rogerdpack

+1

Ruby2rubyはMRI 1.9でしばらくの間働いています。 リッパーも涼しく、MRI(1.9以降)が付属しています。 –

3

はあなたがラムダまたはPROCをマーシャリングすることはできませんruby2ruby

4

Ruby2Rubyを使用して文字列バージョンのRubyコードを取得するには、this threadが好きかもしれません。

11

あなたも単なる文字列としてあなたのコードを入力することができます。

code = %{ 
    lambda {"hello ruby code".split(" ").each{|e| puts e + "!"}} 
} 

その後、evalの

ルビーラムダを返します
eval code 

でそれを実行します。

%{}フォーマットを使用すると、文字列はエスケープされますが、一致しない中かっこだけが閉じられます。つまり、このような中括弧は%{ [] {} }のようにネストすることができ、それはまだ囲まれています。

ほとんどのテキスト構文ハイライターはこれが文字列であることを認識していないため、通常のコードハイライトも表示します。

0

procのは、ファイルに定義されている場合、Uは、PROCのファイルの場所を取得することができますそれをシリアル化し、逆シリアル化した後、その場所を使用して再度プロックに戻ります。

proc_location_array = proc。source_location

デシリアライズ後:

FILE_NAME = proc_location_array [0]

LINE_NUMBER = proc_location_array [1]

proc_line_code = IO.readlines(FILE_NAME)LINE_NUMBER - 1]

proc_hash_string = proc_line_code [proc_line_code.index( "{").. proc_line_code.length]

PROC =評価( "ラムダ#{proc_hash_string}")

関連する問題