修改self但具有相同的数据类型

时间:2018-03-19 16:31:42

标签: ruby

我有一个Bitmap课程(我拥有源代码)有一个构造函数。

我已经为文件创建了自己的加密方法,并且在初始化Bitmap时,它可能必须先解密文件才能加载它。我有一个方法可以做到这一点:Bitmap::load_png。它返回一个Bitmap对象。

现在,这个项目已经有数百个引用Bitmap.new,所以我不想要替换每一个(并且有些类继承Bitmap或检查{ {1}},所以我无法替换所有内容。

出于这个原因,我想编写一些可以正常初始化.is_a?的东西,或者根据给定的参数数量使用Bitmap。如果有2,则应使用原始Bitmap::load_png,否则应使用Bitmap.new

我正在努力弄清楚我是如何做到这一点的。我无法在Bitmap::load_png中返回Bitmap::load_png的结果,因为忽略了返回值。 我也无法在def initialize中返回值,因为这也会覆盖继承它的类。

这里有一些参考代码:

def self.new

我真的不知道如何才能做到这一点。我不想花四天时间挖掘我的所有代码来查找对class Bitmap alias old_init initialize def initialize(*args) if args.size == 2 old_init(*args) # old_init modifies self's data else Bitmap::load_png(*args) # ::load_png returns a new Bitmap object end end end 的引用,并将其替换为Bitmap.new(这样可行)。

所以我想我想要的是这个Bitmap.get类的self.replace(value)方法。但是,我不知道数据存储的内容和位置。我不知道它使用了哪些变量或方法。

1 个答案:

答案 0 :(得分:0)

这是一种可能更有效的方法:

class Bitmap
end

module BitmapWrapper
  def self.new(*args)
    case args.size
    when 2
      Bitmap.new(*args)
    else
      Bitmap.load_png(*args)
    end
  end
end

Object.send(:const_set, :CompiledBitmap, Bitmap)
Object.send(:remove_const, :Bitmap)
Object.send(:const_set, :Bitmap, BitmapWrapper)

这将使用可以介于中间的包装器交换已编译的Bitmap类。这很脏,但是当你有很多引用Bitmap的代码时应该可以工作。