2017-01-20 2 views
2

Ich benutze Trie (https://github.com/tyler/trie) Edelstein im Projekt und liebe es. Aber es hat ein Problem, das wirklich nervt.Ruby Overriding-Methode von Trie gem - undefined Methode

has_key? Methode gibt nil, wenn der Schlüssel nicht statt false (wie jede Methode mit ? sollte Endung)

gefunden

Ich habe versucht, ein Problem auf ihre GitHub Öffnung (https://github.com/tyler/trie/issues/26) aber kein Glück.

Also, vernünftiger nächster Schritt - versuchen Sie, die Methode zu überschreiben.

Ich habe das mein Projekt:

class Trie 
    alias :old_has_key? :has_key? 
    def has_key?(key) 
     puts "My new Trie has_key" 
     old_has_key?(key) 
    end 
end 

Nur um zu sehen, ob ich damit durchkommen kann.

Leider, wenn ich rails console laufen erhalte ich:

`<class:Trie>': undefined method `has_key?' for class `Trie' (NameError) 

Wie ich an anderer Stelle gefunden, sollte diese Arbeit. Irgendeine Idee, warum es nicht tut?

Was fehlt mir hier? Standort von trie.rb? Etwas anderes?

+0

Die am häufigsten akzeptierte Definition von Prädikat Verfahren ist, dass es einen truthy oder Falsey Wert zurückgibt. Die Rückkehr von "Null" als falschem Wert funktioniert hier meistens gut. Wenn Sie es in einer Bedingung wie 'if trie.has_key '(' was auch immer ') verwenden, funktioniert es genau so, als ob' false 'zurückgegeben worden wäre. –

+0

Das offensichtlichste Beispiel ist der 'Defined?' - Operator (technisch keine Methode), der 'nil' für undefined und eine Zeichenfolge zurückgibt, die die Definition anders beschreibt. –

+0

Ok, was richtig ist, ist strittig, aber selbst ihre Dokumente sind falsch, weil sie sagen, dass die Methode 'true/false' zurückgibt, was nicht der Fall ist. Ich weiß, dass es in den meisten Fällen funktioniert, aber es funktioniert nicht, wenn Sie versuchen, es mit einem anderen booleschen Wert zu vergleichen. Meine Frage bleibt noch, warum ich diesen Fehler bekomme, das verwirrt mich. – Milan

Antwort

2

Von Ihrer Fehlermeldung scheint es, dass Sie die has_key?-Methode auf der Trie-Klasse aufrufen, keine Instanz davon. Wenn Sie eine Instanz erstellen, funktioniert Ihr Code einwandfrei:

my_trie = Trie.new 
my_trie.has_key?('foo') 
# My new Trie has_key 
# => nil 
+0

Eigentlich bekomme ich Fehler, wenn ich versuche, "Rails-Konsole" zu laufen. Call wird nicht einmal ausgeführt.Lass mich meine Frage bearbeiten. – Milan

+0

Auch hier funktioniert Ihr Code, solange Sie ihn richtig verwenden. Überprüfen Sie die Spurverfolgung Ihres Fehlers. Wahrscheinlich gibt es einen Aufruf an "Trie.has_key" ("was auch immer"), der beim Start von Schienen ausgeführt wird und zu dem Fehler führt. –

+0

Es stellt sich heraus, dass ich meinen 'trie.rb' tiefer in die Hierarchie bewegen musste. Nicht ganz sicher warum. – Milan

1

So habe ich das Problem gefunden.

Meine neue Klasse wurde unter /lib Ordner in meiner Rails App verschachtelt. Sobald ich es auf /lib/utils/ verschoben habe, funktionierte es!

Dies bedeutet, dass loader meine benutzerdefinierte Klasse vor tatsächlichen Trie Klasse abgeholt hat. Noch immer nicht sicher warum.

1

Sie können ein wenig mehr einfach patchen: (wie `` has_key)

class Trie 
    def has_key?(key) 
     !!super 
    end 
end 
Verwandte Themen