覆盖实例方法

时间:2012-07-20 15:33:45

标签: ruby metaprogramming

我有两个文件foo和bar。 Foo实现了类并初始化了实例。在文件bar.rb里面我想要foo.rb但我也希望从foo.rb改变Foo :: Bar的实现

dir tree

  • foo.rb
  • bar.rb

foo.rb

module Foo
  class Bar
    def random_method
      puts "Foo::Bar.random_method"
    end 
  end
end
Foo::Bar.new.random_method

bar.rb

#here I want overwrite Foo::Bar.random_method
require_relative 'foo' # so this line use new random_method

1 个答案:

答案 0 :(得分:2)

如果您不允许触摸foo.rb,则无法执行此操作(AFAIK)。

# bar.rb

# redefine another random method (to be precise, define its first version)
module Foo
  class Bar
    def random_method
      puts 'another random method'
    end
  end
end

require_relative 'foo' # this will redefine the method and execute version from foo.rb

一种可能的方法是拆分Foo::Bar的声明和使用它的代码。

# foo_def.rb
module Foo
  class Bar
    def random_method
      puts "Foo::Bar.random_method"
    end 
  end
end

# foo.rb
require_relative 'foo_def'
Foo::Bar.new.random_method

# bar.rb
require_relative 'foo_def'

# replace the method here
module Foo
  class Bar
    def random_method
      puts 'another random method'
    end
  end
end

require_relative 'foo' # run with updated method