0

Trie でさかのぼってテストを構築しようとしています。トライは実際に機能し、格納された単語を返しますが、ハッシュに対してテストを実行しようとすると、トライが nilclass を生成していることがわかります。

ここに t9_trie.rb があります (falsetru の v の有用な修正を反映するように微調整されています)

class Trie
  def initialize
    @root = Hash.new
  end

  def build(word) 
    node = @root
    t9num = word.tr('a-z', '22233344455566677778889999')
    t9num.each_char do |ch|
      node[ch] ||= Hash.new
      node = node[ch]
    end
    (node[:end] ||= []) << word
  end

  def find(str) 
    node = @root
    str.each_char do |ch|
      return nil unless node = node[ch]
    end
    node[:end] && true
    node[:end].to_a
  end
end

# words = %w[ant bear cat anu amulet quest question whatchamacalit yes zest]
# words = File.open('dictionary_copy.txt') {|f| f.read }.split

word = "ant"
t = Trie.new
t.build("#{word}")
puts t.inspect
puts t.find('268').class
search = [t.find('268')]
ary = search.to_a
puts ary.class
puts ary

そして、ここに t9_trie_spec.rb があり、これは現在動作しています:

require 'test/unit'
here = File.expand_path(File.dirname(__FILE__))
require "#{here}/sandbox"

class StringExtensionTest < Test::Unit::TestCase

  def test_if_Trie_exists
    word = "ant"
    t = Trie.new
    t.build("#{word}")
    assert_match /Trie/, t.to_s, "no Trie found"
  end

  def test_if_find_works
    word = "ant"
    t = Trie.new
    t.build(word)
    search = t.find('268') #had to remove extra nested arrays
    assert_send([search, :member?, word]) #and tweak this language
  end

end
4

1 に答える 1

1

の戻り値printnil

irb(main):001:0> a = print '1'
1=> nil

メソッドの最後のステートメントを削除 (または に置き換え)する必要がありますprintprintreturnfind

class Trie

  ...

  def find(str) 
    node = @root
    str.each_char do |ch|
      return nil unless node = node[ch]
    end
    node[:end] && true
    node[:end].to_a # <-------------- remove print
  end
end

テスト ケースの変更 ( "#{word}"`word にも置き換え):

require 'test/unit'

class StringExtensionTest < Test::Unit::TestCase
  ...
  def test_if_find_works
    word = "ant"
    t = Trie.new
    t.build(word)
    search = t.find('268')
    ary = search.to_a
    assert(ary.member? word)
  end
end
于 2013-09-11T16:49:48.077 に答える