2011-08-22 21 views
2

我有一个客户端/服务器原型的想法,其中服务器将持有Marshal.dump的类对象及其版本号的散列。然后客户端可以实例化之前查询关于版本号的服务器,并导入类的较新版本:从套接字连接导入一个Ruby类?

class Stuff 
    def methods 
    gibberish 
    end 
end 

$obj_hash["Stuff"] = [3.0, Marshal.dump(Stuff)] 

我遇到这样的问题:红宝石似乎并不希望让我Marshal.load数据一旦我从服务器下载它,因为类和它的方法不存在于客户端。如果我通过创建一个“虚拟”类来绕过这一点,那么我无法用Marshal.load'ed数据替换虚拟类。如果我只是尝试使用加载的数据作为类,它将根据虚拟类的内容而不是下载的内容运行。

还有另外一种方法可以解决这个问题吗?如果没有,那么我想我可以只是gz代码,然后在另一端评估它,但我试图避免使用eval或通过线路发送容易破译的代码。

在此先感谢您的任何建议。

+1

瑞尔,你不能这样做,类必须在对方,所以你必须把你的源代码,并在客户端EVAL它,如果它不是在那里。 –

回答

1

看看会发生什么。

class Stuff 
    def methods 
    "foo" 
    end 
end 

ruby-1.8.7-p352 :001 > Marshal.dump(Stuff) 
=> "\004\bc\bStuff" 

注意它对“方法”或“富”没有提及。如果服务器没有发送该代码,客户应该如何知道什么是Stuff#方法应该做的?

它不会。 :)

要做你想做的事情,你必须发送代码本身并评估它。当然,你必须自己实现版本控制逻辑,并且“真正重新定义”它们的类(而不是猴子补丁)。

are you allowed to redefine a class in ruby? or is this just in irb