我正在使用Spree,Spree有一个名为Order
的类,看起来像:
module Spree
class Order
# class definition.
end
end
字符串
在我自己的应用程序中,我一直像这样定制Order
:
Spree::Order.class_eval do
# customisations
end
型
我的问题是,我可以这样做吗:
module Spree
class Order
# My own customisations.
end
end
型
这有什么缺点吗?本质上,我想避免使用class_eval
。
3条答案
按热度按时间rseugnpd1#
Benjamin,如果现有的类不存在或未加载,reopen class不会通知您(但
class_eval
会引发错误)。但是如果你有测试覆盖率,我猜重新打开类应该是安全的?
请参阅https://stackoverflow.com/a/900508/474597以获得更详细的解释。
yhuiod9q2#
没有class_eval,你不能改变类。只要尝试覆盖一个方法,所有其他方法都消失了。使用class_eval,你可以避免它。这是ruby的方式。
mzillmmw3#
还有另一种方法可以解决这个问题,它在Spree的情况下工作得很好。我想我会把这个答案留给其他与Spree一起工作的人。
您可以使用
prepend
来“安排"在Spree最终加载的任何时间重新打开类。字符串
如果你的装饰器模块有太多的方法,你可以也应该使用multiple并控制prepend的顺序。
型