gpt4 book ai didi

ruby - 从套接字连接导入 Ruby 类?

转载 作者:太空宇宙 更新时间:2023-11-03 16:36:32 24 4
gpt4 key购买 nike

我有一个客户端/服务器原型(prototype)的想法,其中服务器将保存 Marshal.dump'ed 类对象的散列及其版本号。然后客户端可以查询服务器的版本号并在实例化之前导入类的更新版本:

class Stuff
def methods
gibberish
end
end

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

我遇到的问题是,Ruby 似乎不允许我在从服务器下载数据后 Marshal.load,因为该类及其方法在客户端中不存在.如果我通过创建一个“虚拟”类来绕过它,那么我将无法用 Marshal.load 数据替换虚拟类。如果我只是尝试将加载的数据用作一个类,它会根据虚拟类的内容而不是下载的内容运行。

还有其他方法可以解决这个问题吗?如果不是,那么我想我可以只 gz 代码,然后在另一端对其进行 eval,但我试图避免使用 eval 或通过线路发送易于破译的代码。

提前感谢您的任何建议。

最佳答案

看看会发生什么。

class Stuff
def methods
"foo"
end
end

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

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

不会的。 :)

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

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

关于ruby - 从套接字连接导入 Ruby 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7142776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com