【问题标题】:class_eval and open classesclass_eval 和公开课
【发布时间】:2014-03-10 02:42:05
【问题描述】:

我正在使用 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

【问题讨论】:

  • 嘿.. 你找到解决方案了吗?我现在刚刚开始使用 spree,需要向 Spree::Order 类添加一个常量。使用class_eval 不知何故不适用于常量,并且没有class_eval,我无法弄清楚如何访问我正在重新打开的类中的其他方法。
  • 尝试使用@@some_constant。不是 Spree 问题,而是普遍的 Ruby 怪异问题。
  • 是的..这就是我所做的,它奏效了。不过需要注意的是,我必须 require 在打开它之前打开我正在打开的模块/类。这样可以确保在我再次打开之前加载原始类文件以更改它以避免出现类未找到错误。

标签: ruby spree


【解决方案1】:

Benjamin,如果现有类不存在或未加载,则重新打开类不会通知您(但class_eval 会引发错误)。

但如果你有测试覆盖率,我猜重新开课应该是安全的?

更详细的解释见https://stackoverflow.com/a/900508/474597

【讨论】:

  • 啊,好点。我正在现有 class_evaled 类的过程中。
【解决方案2】:

没有class_eval,你不能改变类。 只需尝试覆盖一种方法,所有其他方法都消失了。使用 class_eval 你可以避免它。这就是红宝石的方式。

【讨论】:

  • @raj 启发我!
  • 打开一个类并覆盖一个方法如何删除所有其他方法?你能举个例子吗?
  • 也许你是对的。不记得了。可能是特定于 Rails 的。在rails中你需要使用class_eval,否则初始类evaportaes。
  • 如果您在 Rails 中重新打开一个类,初始类将永远不会消失。你能告诉我任何示例资源吗?我找不到。
  • 我不需要任何资源。这就是rails的工作方式。可能与它的内部缓存类有关?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2014-09-18
  • 1970-01-01
  • 2023-03-09
  • 2017-04-22
  • 2020-09-05
相关资源
最近更新 更多