0

私は RSPEC の問題に取り組んでおり、このサイトで得たすべての支援は素晴らしいものでした。しかし、私はそれで少し問題を抱えています。

アイデアは、Ruby でディクショナリ オブジェクトを作成することであり、RSPEC コードは次のようになります。

require 'dictionary'

describe Dictionary do
  before do
    @d = Dictionary.new
  end

  it 'is empty when created' do
    @d.entries.should == {}
  end

  it 'can add whole entries with keyword and definition' do
    @d.add('fish' => 'aquatic animal')
    @d.entries.should == {'fish' => 'aquatic animal'}
    @d.keywords.should == ['fish']
  end

  it 'add keywords (without definition)' do
    @d.add('fish')
    @d.entries.should == {'fish' => nil}
    @d.keywords.should == ['fish']
  end

  it 'can check whether a given keyword exists' do
    @d.include?('fish').should be_false
  end

  it "doesn't cheat when checking whether a given keyword exists" do
    @d.include?('fish').should be_false # if the method is empty, this test passes with nil returned
    @d.add('fish')
    @d.include?('fish').should be_true # confirms that it actually checks
    @d.include?('bird').should be_false # confirms not always returning true after add
  end

  it "doesn't include a prefix that wasn't added as a word in and of itself" do
    @d.add('fish')
    @d.include?('fi').should be_false
   end

  it "doesn't find a word in empty dictionary" do
    @d.find('fi').should be_empty # {}
  end

  it 'finds nothing if the prefix matches nothing' do
    @d.add('fiend')
    @d.add('great')
    @d.find('nothing').should be_empty
  end

  it "finds an entry" do
    @d.add('fish' => 'aquatic animal')
    @d.find('fish').should == {'fish' => 'aquatic animal'}
  end

  it 'finds multiple matches from a prefix and returns the entire entry (keyword + definition)' do
    @d.add('fish' => 'aquatic animal')
    @d.add('fiend' => 'wicked person')
    @d.add('great' => 'remarkable')
    @d.find('fi').should == {'fish' => 'aquatic animal', 'fiend' => 'wicked person'}
  end

  it 'lists keywords alphabetically' do
    @d.add('zebra' => 'African land animal with stripes')
    @d.add('fish' => 'aquatic animal')
    @d.add('apple' => 'fruit')
    @d.keywords.should == %w(apple fish zebra)
  end

  it 'can produce printable output like so: [keyword] "definition"' do
    @d.add('zebra' => 'African land animal with stripes')
    @d.add('fish' => 'aquatic animal')
    @d.add('apple' => 'fruit')
    @d.printable.should == %Q{[apple] "fruit"\n[fish] "aquatic animal"\n[zebra] "African land animal with stripes"}
  end
end

「エントリを見つける」までのすべてがあり、それが問題に遭遇した場所です。これまでの私のコードは次のようになります。そして、コードの作成を手伝ってくれたこのサイトのすべての人に感謝します。

class Dictionary
  attr_accessor :keywords, :entries

  def initialize 
    @entries = {}
  end

  def add(defs)
    defs.each do |word, definition|
      @entries[word] = definition
    end      
  end

  def keywords
    @entries.keys.sort
  end

  def include?(key)
    @entries.key?(key)
  end 

  def find(query)
    @entries.select { |word, definition| word.scan(query).join == query}  
  end    
end

そのテストで得られるエラーは次のとおりです。

1) Dictionary finds an entry
     Failure/Error: @d.find('fish').should == {'fish' => 'aquatic animal'}
       expected: {"fish"=>"aquatic animal"}
            got: [["fish", "aquatic animal"]] (using ==)
       Diff:
       @@ -1,2 +1,2 @@
       -"fish" => "aquatic animal"
       +[["fish", "aquatic animal"]]

したがって、ファインダーメソッドからの出力がハッシュではなく配列であるという問題があるようです。それを修正するための最良の方法は何ですか?前もって感謝します!

4

2 に答える 2

3

かなり古いバージョンの Ruby を使用している必要があります。

Ruby 1.8.7 では:

{}.select{} # => []

最新の Ruby では:

{}.select{} # => {}

あなたは出来る:

  • Ruby を 1.9.2+ にアップグレードする
  • 代わりに使用rejectし、条件を逆にします
  • または私のbackports宝石を使用してrequire 'backports/force/hash/select'、Ruby 1.8.xで同じ動作を取得します。
于 2013-03-07T16:08:43.263 に答える
0

select によって返された結果を取得して、次のように実行してみてください。

Hash[result]

または、より原始的には、ハッシュを作成するだけです!

{result.first.first => result.first.last}
于 2013-03-07T16:16:32.967 に答える