2017-01-20 5 views
2

私はプロジェクトでTrie(https://github.com/tyler/trie)gemを使用し、それを愛しています。しかし、それは本当に不愉快な一つの問題を抱えています。キーが代わりにfalseで見つからない場合Trie gemのRubyオーバーライドメソッド - 未定義メソッド

has_key?方法は、(?でなければならない終わるすべてのメソッドとして)

nilを返し、私は彼らの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'を返すことは、ほとんどの場合ここでうまくいきます。 'if trie.has_key?( '何でも')'のような条件で使うと、 '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?( '何でも')'を呼び出すかもしれません。 –

+0

私は自分の 'trie.rb'をより深く階層に移動しなければならないことが判明しました。なぜ、どういうわけかわからない。 – Milan

1

問題が見つかりました。

私の新しいクラスは、私のRailsアプリケーションの/libフォルダの下にネストされていました。私がそれを/lib/utils/に移動するとすぐに、それはうまくいった!

これは、ローダーが実際のTrieクラスの前にカスタムクラスを取得したことを意味します。まだわからない

1

あなたは、もう少し簡単にパッチを適用することができます(?has_key `のような`)

class Trie 
    def has_key?(key) 
     !!super 
    end 
end 
関連する問題