2016-08-09 3 views
0

Ich habe einen Code von Drittanbietern, die wie folgt ist:Ist es in Ruby möglich, eine Initialisierungsmethode neu zu definieren?

class Foo 
    def initialize 
    @hello = "world" 
    end 

    def msg 
    @hello 
    end 
end 

Dann habe ich

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

Dann wird eine weitere Code von Drittanbietern ein Verfahren in meinem Haupt ruft eine neue Datei foo_redefinition.rb mit diesen Inhalten hinzugefügt Klasse, und in der Datei meiner Hauptklasse mache ich require_relative 'foo_redefinition'. Wenn der Code des Drittanbieters (nach dem Aufruf meiner Methode, also dem Lesen meiner Hauptdatei, die die Neudefinition erfordert) Foo.msg aufruft, wird "Welt" zurückgegeben, nicht "Welt".

Auch wenn ich

require_relative 'foo_redefinition' 

# ... lots of code 

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

Meine Fragen sind:

  1. Ist es möglich, eine Methode initialize neu zu definieren?
  2. Wenn ja, was mache ich hier falsch?
+1

'initialize' ist eine Methode wie jede andere Methode. Es gibt überhaupt nichts Besonderes. Ihre Frage ist also: Kann ich Methoden neu definieren? Und die Antwort ist: Ja. Die Antwort auf Ihre zweite Frage lautet: Ich weiß es nicht. Es gibt nicht genügend Informationen in Ihrem Post. –

+0

Ich nehme an, dass ich neu initialisiere, nachdem die Instanz, die ich ändern wollte (und auf die ich überhaupt keinen Zugriff habe), bereits initialisiert wurde, so dass die Änderung auftritt, aber ohne Wirkung. –

+0

Antworten auf Ihre Fragen sind 1) ja; 2) Ich habe keine Ahnung, ohne ein vollständiges Beispiel zu sehen, das so funktioniert, wie du es beschreibst. –

Antwort

2

Ich habe Angst, dass Foo eine träge autoload ed Klasse ist, und Sie sind „neu zu definieren“ initialize vor Foo geladen wird.

Versuchen Sie, diese

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

Diese Foo zwingt, bevor die Neudefinition etwas geladen werden.

Verwandte Themen