2016-08-09 5 views
0

У меня есть сторонний код, который походит на это:Возможно ли в Ruby переопределить метод инициализации?

class Foo 
    def initialize 
    @hello = "world" 
    end 

    def msg 
    @hello 
    end 
end 

Затем я добавил новый файл foo_redefinition.rb с этим содержимым

class Foo 
    def initialize 
    @hello = "welt" 
    end 
end 

Затем другой код третьей стороны вызывает метод в мой основной класс, а в файле моего основного класса я делаю require_relative 'foo_redefinition'. Однако, когда код третьей стороны (после вызова моего метода, таким образом, считывая мой основной файл, который требует переопределения) вызывает Foo.msg, он возвращает «мир», а не «welt».

Кроме того, когда я

require_relative 'foo_redefinition' 

# ... lots of code 

Foo::new.msg #=> world (instead of welt) 

Мои вопросы:

  1. Можно ли переопределить метод инициализации?
  2. Если да, то что я делаю неправильно здесь?
+1

'initialize' - это метод, как и любой другой метод. В этом нет ничего особенного. Итак, ваш вопрос: могу ли я переопределить методы? И ответ: да. Ответ на ваш второй вопрос: я не знаю. В вашем сообщении недостаточно информации. –

+0

Я предполагаю, что я переопределяю инициализацию после того, как экземпляр, который я хотел изменить (и к которому у меня нет никакого доступа) уже был инициализирован, поэтому изменение происходит, но не имеет никакого эффекта. –

+0

Ответы на ваши вопросы: 1) да; 2) Я понятия не имею, не видя полного примера, который работает так, как вы описываете. –

ответ

2

Боюсь, что Foo это лениво autoload класс-е изд, и вы «переосмысление» initialize перед загрузкой Foo.

Попробуйте

Foo.class_eval do 
    def initialize 
    @hello = "welt" 
    end 
end 

Это заставляет Foo быть загружен до переопределения ничего.

Смежные вопросы