Есть ли способ добавить функцию для ее инициализации и выполнения? - PullRequest
0 голосов
/ 26 марта 2019

Допустим, у меня есть класс Test

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

Есть ли способ как-то расширить класс инициализации и выполнить в нем какой-нибудь метод?

Например, я хочу:

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

test = Test.new()

Должен вывести

cool
test

Спасибо!

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

Вы можете определить модуль, содержащий ваше расширение:

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
2 голосов
/ 26 марта 2019

Если код для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...