2012-01-14 6 views
0

OK、Rubyの達人、これはこの説明のために私と一緒にタイトルに記述し、その負担するのは難しいものです:ルビー:マーシャルとアンマーシャリング変数ではなく、インスタンス

私は、文字列を渡すために探していますオブジェクトを構成するプロパティのコレクションではなく、実際の変数:ハンドルをオブジェクトに追加します。

これは、ファイルシステム、ネットワーク、またはメモリ内にあるリソースを扱っているためです。私は一貫した方法でこれらのそれぞれを扱うことができるURIハンドラを作成したいので、私は例えばのようなスキームを持つことができます。

  • ファイル://
  • ます。http://
  • のftp://
  • インメモリ://

あなたのアイデアを得ます。それは私が理解しようとしている最後のものです:Rubyでオブジェクトへの参照の文字列表現を取得し、その文字列を使用して新しい参照を作成する方法はありますか?私は実際に参照をマーシャリングすることに興味があり、オブジェクトはマーシャリングしません。理想的には、Object#object_idのようなものがあります。これは取得するのが簡単で、同じオブジェクトを参照する別の場所で新しい変数を作成するのに使います。私はこれが本当に壊れやすく、珍しいユースケースであることを認識しています。オブジェクトがガベージコレクションされないようにする既存の変数がある限り、1つのRubyプロセス内でのみ動作しますが、 inmemory体系私は開発中です。

私は考えることができる唯一の選択肢されています

  • マーシャルオブジェクト全体とURIにそれを詰め込むが、オブジェクト内のデータが画像バッファであるため、それは動作しません -
  • 非常に大きいです
  • 後で検索するための変数を格納するグローバルまたはシングルトンの煉瓦領域を作成します。 object_idのハッシュ:変数のペア。これは少し臭いですが、うまくいくでしょう。

他の考え、StackOverflowers?

答えて

4

ObjectSpace._id2refがあります:(それはデフォルトでは無効になっていますようにあまり)ガベージコレクションObjectSpaceについての注意事項に加えて

f = Foo.new #=> #<Foo:0x10036c9b8> 
f.object_id #=> 2149278940 
ObjectSpace._id2ref(2149278940) #=> #<Foo:0x10036c9b8> 

はJRubyの中で大きなパフォーマンスのペナルティを運ぶ

+0

ありがとうございます。 – Matt

1

変数にオブジェクトではありませんルビー。あなたはそれらを整列化/非整列化できないだけでなく、何かと一緒にすることはできません。オブジェクトでは何かしかできませんが、変数はそうではありません。

0

あなたがVMwareのGemstoneの上に構築された代替Rubyの実装ですMagLevに見ることができる(彼らははしかし、オブジェクトだったら!それは本当にいいだろう)。あなたのユースケースに合ったオブジェクトモデルを配布しています。

オブジェクトは中央のGemstneインスタンスに保存され(いくつかの素晴らしいキャッシングを使用して)、任意の数のリモートワーカーインスタンスからアクセスできます。そうすることで、どの従業員も同じオブジェクト空間で行動し、同じオブジェクトに同時にアクセスすることができます。こうすることで、グローバルガベージコレクタを1つのRubyインスタンス上で実行したり、Continuationsを使用して(すべてのスタックフレームを保持しながら)任意のポイントで実行をシームレスに異なるノードに移動するなどの作業を行うこともできます。