2017-01-20 27 views
2

我在項目中使用Trie(https://github.com/tyler/trie)gem,並且喜歡它。但它有一個問題真的很煩人。Trie gem的Ruby重寫方法 - undefined方法

has_key?方法返回nil關鍵時沒有發現的,而不是false(如?應結尾的方法)

我試着對他們的GitHub(https://github.com/tyler/trie/issues/26),但沒有運氣打開的問題。

因此,合理的下一步 - 嘗試覆蓋該方法。

我說這我的項目:

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

只是爲了看看我是否能擺脫它。

不幸的是,當我運行rails console我得到:

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

正如我在別處找到了,這應該工作。任何想法爲什麼它不?

我在這裏錯過了什麼? trie.rb的位置?還有別的嗎?

+0

的斷言方法最普遍接受的定義是,它返回一個truthy或falsey值。在大多數情況下,將'nil'作爲一個虛假的值返回工作得很好。如果你在'如果trie.has_key?'('whatever')這樣的條件下使用它,它就像'false'會返回一樣。 –

+0

最明顯的例子是'defined?'操作符(雖然在技術上不是一種方法),它返回'nil'作爲未定義的,並且一個字符串描述了否則的定義。 –

+0

好吧,什麼是正確的是有爭議的,但即使他們的文檔是錯誤的,因爲他們說,該方法返回「真/假」,而不是。 我知道它在大多數情況下都能正常工作,但當您試圖將它與其他布爾值進行比較時,它不起作用。 我的問題仍然存在,爲什麼我得到這個錯誤,這是令我困惑的。 – Milan

回答

2

從您的錯誤消息看來,您正在調用Trie類中的has_key?方法,而不是它的一個實例。如果你創建一個實例,你的代碼工作得很好:

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

其實,當我嘗試運行'rails console'時出現錯誤。呼叫甚至不會執行。讓我編輯我的問題。 – Milan

+0

同樣,只要您正確使用它,您的代碼就能正常工作。檢查你的錯誤的痕跡。可能有一些調用在啓動導軌期間執行的'Trie.has_key?('whatever'),並導致錯誤。 –

+0

事實證明,我必須將我的'trie.rb'更深入地移動到層次結構中。不太清楚爲什麼。 – Milan

1

所以我發現了這個問題。

我的新課程嵌在我的Rails應用程序中的/lib文件夾下。一旦我將它移動到/lib/utils/它工作!

這意味着裝載程序會在實際的Trie類之前拿起我的自定義類。仍然不知道爲什麼。

1

可以接更多一點簡單的:(?像``對象的has_key)

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