来自Trie gem的Ruby重写方法 - 未定义方法

时间:2017-01-20 13:16:39

标签: ruby-on-rails ruby trie

我在项目中使用Trie(https://github.com/tyler/trie)gem并喜欢它。但它有一个问题真的很烦人。

找不到密钥时,

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的位置?还有别的吗?

3 个答案:

答案 0 :(得分:2)

从您的错误消息中,您似乎在has_key?类上调用Trie方法,而不是它的实例。如果您创建一个实例,您的代码就可以正常工作:

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

答案 1 :(得分:1)

所以我发现了问题。

我的新课程嵌套在我的Rails应用程序的/lib文件夹下。我一把它移到/lib/utils/就行了!

这意味着加载程序在实际Trie类之前选择了我的自定义类。仍不确定原因。

答案 2 :(得分:1)

你可以更简单地修补:

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