我有一个类,它由另一个类的方法动态扩展。这些方法中还有一些额外的静态信息,例如: G:
class A
# @b = B.new # in initialize
def a
puts @b.info[:data][__callee__]
end
end
class B
attr_reader :info
@info = {:data => {:a => :method_name, …}}
def define_new_a name
A.class_eval %Q(
alias_method name, :a
)
@info[:data][name => :method_name]
end
define_new_a :a1
define_new_a :a2
end
此别名方法:a1
以某种方式依赖于@info
结构(A
中的代码使用B#info[:data]
)。 @info
也可能在执行期间更新。在我第二次(第三次,第四次等)时间调用A.new
之前,一切都很完美。在这种情况下,我已经使用方法更新了A
类定义,例如:a1
和:a2
(动态创建),但是B#info
的纯粹新实例。
所以,问题是:
TL; DNR 我们的class
定义可能会发生变化:需要动态添加方法和相关数据。类实例是在长期内创建的。有没有办法使用相关数据进行当前类定义 synchronized ?
说明: 其中我应该存储一些其他信息,例如info
结构,以使其与当前定义同步A
班的?使B
成为单身并不是一个选项,而是使@@info
成为一个类变量,因为它可能在A
的不同实例之间实际上有所不同。实际上,为了澄清问题,引入了两个类;可能有一个类同时具有a)动态创建的方法和b)一些额外的信息,这些方法依赖于。带有散列instance ⇒ info
的单身人士看起来有点多余而且完全不优雅。
另一个问题是是否有一种简单的方法来实例化新版本的,而没有任何动态创建(在当前长期运行中)的东西?
提前致谢。
答案 0 :(得分:1)
当您的B级加载时,您在A上调用class_eval
两次以定义两种新方法。
所以没有:一旦加载了B的定义,A的定义就会不可逆转地改变,你就无法再访问它的原始定义了。
您可以做的解决方法是将A打包到一个类中,以保持原始功能的完整性:
class AFresh
# Your code
end
class A < AFresh
# Just inherit...
end