有没有办法添加一些函数来初始化和执行它?

时间:2019-03-26 07:07:30

标签: ruby methods extend

假设我有一个课程Test

class Test
  def initialize()
    puts "cool"
  end
end

是否可以通过某种方式扩展初始化类并在其中执行某些方法?

例如,我要:

class Test
  def func()
    puts "test"
  end
end

test = Test.new()

应该输出

cool
test

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以定义一个包含扩展名的模块:

module TestExtension
  def initialize
    super
    puts 'test'
  end
end

,然后prepend该模块到Test

class Test
  def initialize
    puts 'cool'
  end
end

Test.prepend(TestExtension)
Test.new
# cool
# test

答案 1 :(得分:2)

如果Test的代码不受您控制,并且您想注入test

Test.class_eval do
  def test
    puts "TEST"
  end

  alias initialize_without_test initialize

  # This, if you want the return value of `test` to replace the original's    
  def initialize(*args, &block)
    initialize_without_test(*args, &block)
    test
  end

  # Or this, if you want to keep the return value of original `initialize`
  def initialize(*args, &block)
    initialize_without_test(*args, &block).tap do
      test
    end
  end
end