13

私は辞書クラスを持っており、キー (キーワードとして) と値 (定義として) を「追加」メソッドで空のハッシュにプッシュできるようにしたいと考えています。それを構文的に書く方法がわかりません。RSPEC ファイルも含めました。

ルビー:

 class Dictionary
     attr_accessor :keyword, :definition
     def entries
          @hash = {}
     end
     def add(options)
          options.map do |keyword, definition|
               @hash[keyword.to_sym] = definition
          end
     end
 end

Rspec:

 require 'dictionary'

   describe Dictionary do
   before do
       @d = Dictionary.new
   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

どんな助けでも大歓迎です。ありがとうございました!

更新: Dave Newton さん、返信ありがとうございます。あなたのコードを使用したところ、次のエラーが発生しました。

エラー:

 *Failure/Error: @d.keywords.should == ['fish']
 NoMethodError:
 undefined method `keywords' for #<Dictionary:0x007fb0c31bd458 
 @hash={"fish"=>"aquatic animal"}>*

@hash[word.to_sym] = defintion を使用して「単語」をシンボルに変換すると、別のエラーが発生します

 *Failure/Error: @d.entries.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

24

でハッシュをインスタンス化しDictionaryますinitialize:

class Dictionary
  def initialize
    @hash = {}
  end

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

現在、 を呼び出すまでハッシュはentriesありませんが、そうではありません。

entries新しいハッシュを作成するのではなく、既存のハッシュを返す必要があります。

keywordsハッシュのキーを返す必要があります。

keywordと のアクセサは必要ありませんdefinition。このような特異項目は、辞書クラスでは意味がありません。lookup(word)定義を返すようなものが必要になる場合があります。

また、単語を記号に変換しますが、特に仕様で文字列キーを使用しているため、その理由はわかりません。1つ選んでください。これがシンボルが価値を付加するケースであるとは確信していません.

可能な限り多くのコンテキストを提供するために、変数の命名を慎重に検討してください。

于 2013-02-22T22:31:59.207 に答える
8

Rspecを見ると、この設定が必要なようです。

class Dictionary
  def initialize
    @hash = {}
  end

  def add(key_value)
    key_value.each do |key, value|
      @hash[key] = value
    end
  end

  def entries
     @hash
  end

  def keywords
     @hash.keys
  end

end

key.to_symadd メソッドでは使用しないでください。key

メソッドを柔軟に追加できるようにするために、self オブジェクトを返して継続的に追加することができます。

def add(key_value)
  key_value.each do |key, value|
    @hash[key] = value
  end
  self
end

だから、私は今これを行うことができます。

@d.add("a" => "apple").add("b" => "bat")
于 2013-02-23T00:12:54.477 に答える