ruby中的克隆和补丁类

8dtrkrch  于 2022-11-22  发布在  Ruby
关注(0)|答案(3)|浏览(160)

我需要创建类的路径副本,其中对一个模块方法的调用被替换为另一个模块方法调用:

module Foo
    def self.check
        "foo"
    end
end

module Bar
    def self.check
        "bar"
    end
end

class Bark
    def call
        puts Foo.check
    end
end

Bark.new.call => "foo"

Meouw = Bark.dup

...

???

Meouw.new.call => "bar"

你知道我该怎么做吗?

lp0sw83n

lp0sw83n1#

不是问题的答案,因为它被问到,但在我看来,你是试图解决一个XY问题,这不是要走的路。
您需要做的是注入依赖项,而不是对其进行硬编码。

module Foo
  def self.check
    "foo"
  end
end

module Bar
  def self.check
    "bar"
  end
end

class Bark
  def initialize(checker)
    @checker = checker
  end

  def call
    puts @checker.check
  end
end

然后使用所需的模块示例化Bark类,以获得具有所需行为的对象:

Bark.new(Foo).call #=> "foo"
Bark.new(Bar).call #=> "bar"
qni6mghb

qni6mghb2#

奇怪的问题需要奇怪的解决方案。你可以定义Meouw::Foo,并使其引用Bar

Meouw = Bark.dup
Meouw::Foo = Bar

这样,Meouw中的Foo将解析为Meouw::Foo(实际上是::Bar),而不是全局::Foo

Meouw.new.call
# prints "bar"
4xrmg8kj

4xrmg8kj3#

为什么不能保持简单,从Bark继承并覆盖call方法呢?

class Meow < Bark
  def call
    puts Bar.check
  end
end

Meouw.new.call

# prints "bar"

如果您想要 meta更多,也可以使用Class.new

相关问题