Ruby:编组和解组变量,而不是实例

时间:2012-01-14 00:33:19

标签: ruby

好的,Ruby大师,这在标题中难以描述,所以请耐心等待这个解释:

我希望传递一个表示变量的字符串:不是实例,不是构成对象的属性集合,而是实际变量:对象的句柄

这样做的原因是我正在处理可以位于文件系统,网络或内存中的资源。我想创建一个URI处理程序,它可以以一致的方式处理这些中的每一个,所以我可以有像例如。

这样的方案
  • 文件://
  • 的http://
  • 的ftp://
  • inmemory://

你明白了。这是我想要弄清楚的最后一个:有没有办法在Ruby中获取对象的引用的字符串表示,然后使用该字符串来创建新的引用?我真的很感兴趣编组引用,而不是对象。理想情况下会有类似于Object#object_id的东西,这很容易获得,并且使用它来创建一个引用同一个对象的新变量。我知道这可能非常脆弱,因此是一个不寻常的用例:它只能在一个Ruby进程中工作,只要有一个现有的变量来保持对象不被垃圾收集,但这些都适用于我正在开发inmemory计划。

我能想到的唯一选择是:

  • 编组整个对象并将其塞入URI,但这不起作用,因为对象中的数据是图像缓冲区 - 非常大
  • 创建全局或单身炼狱区域以存储变量,以便稍后使用例如object_id的哈希值:变量对。这有点臭,但会起作用。

还有其他什么想法,StackOverflowers?

3 个答案:

答案 0 :(得分:4)

ObjectSpace._id2ref

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

除了关于垃圾收集的警告ObjectSpace在jruby中带来了很大的性能损失(以至于它默认禁用)

答案 1 :(得分:1)

变量不是Ruby中的对象。你不仅不能编组/解组它们,你不能用它们做任何事情。您只能对对象执行某些操作,而不是哪些变量。

(如果他们对象,那么真的很好!)

答案 2 :(得分:0)

您可以查看MagLev这是在VMware的Gemstone之上构建的替代Ruby实现。它有一个可能适合您的用例的分发对象模型。

对象保存在中央Gemstne实例中(带有一些漂亮的缓存),可以被任意数量的远程工作者实例访问。这样,任何工作者都可以在同一个对象空间上操作,并且可以同时访问同一个对象。这样,你甚至可以做一些事情,比如让全局垃圾收集器在一个Ruby实例上运行,或者使用Continuations将执行无缝地移动到不同的节点(同时保留所有堆栈帧)。