21

Joe Van Dykは Ruby メーリング リストに次のように質問しました。

やあ、

Ruby では、lambda/proc オブジェクトをマーシャリングできないと思いますよね? Lispや他の言語でそれは可能ですか?

私がやろうとしていたこと:

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

そのため、何をすべきかのコンテキスト/コードを含むラムダ オブジェクトを BackgroundJob に送信しています。しかし、それは不可能だったと思います。プログラムの実行後に何をすべきかの指示を含む通常の Ruby オブジェクトをマーシャリングすることになりました。

ジョー

4

7 に答える 7

21

Lambda または Proc をマーシャリングすることはできません。これは、どちらもクロージャーと見なされるためです。つまり、定義されたメモリを閉じて参照できるようになります。(それらをマーシャリングするには、作成時にアクセスできるすべてのメモリをマーシャリングする必要があります。)

ただし、Gaius が指摘したように、ruby2rubyを使用してプログラムの文字列を取得できます。つまり、ルビ コードを表す文字列をマーシャリングして、後で再評価することができます。

于 2008-09-01T23:10:45.360 に答える
12

コードを文字列として入力することもできます。

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

次に、evalで実行します

eval code

ルビーラムダを返します。

この形式を使用%{}すると文字列がエスケープされますが、一致しない中括弧でのみ終了します。つまり、このように中かっこを入れ子にすることができ%{ [] {} }、まだ囲まれています。

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

于 2010-09-14T00:14:19.777 に答える
4

Ruby2Ruby を使用して文字列バージョンの Ruby コードを取得することに興味がある場合は、このスレッドを気に入るはずです。

于 2010-03-04T03:13:24.487 に答える
3

ruby2ruby を試す

于 2008-08-23T04:24:49.023 に答える