0

私は Ruby を学ぼうとしている初心者で、次の問題文のコードを書いています: - 最初は空の辞書を作成します。- エントリを追加します。単語がキーであり、意味が値である必要があります。- キーワードと定義を含むエントリ全体を追加します (単語を追加するときは、それが既に存在するかどうかを確認する必要があります) - 定義なしでキーワードを追加します (この場合、定義を nil に設定します) - 特定のキーワードが存在するかどうかを確認できます - キーワードを見つけますエントリを返し、キーワード + 定義を返します - プレフィックスから複数の一致を検索し、エントリ全体 (キーワード + 定義) を返します - つまり、「fi」を検索すると、「fi」で始まるすべてのエントリが返されます - キーワードをアルファベット順にリストします

これまでのところ、次のコードを記述しましたが、キーワードと値を追加すると、最後に追加された値のみが保存されます。次の場合、出力は "@word_list={"great"=>"remarkable"}>" になります。最初の値のセットが失われました。

この問題を解決する方法がわかりません。事前に感謝します!

class Dictionary

  def word_list
     @word_list = Hash.new
  end

  def add new_entry
    case new_entry
     when Hash
        word_list.merge!(new_entry)
     when String
         word_list[new_entry] = nil
    end
   end


d1 = Dictionary.new
d1.add ({"fish" => "aquatic animal", "fiend" => "bad person"})
d1.add ({"great" => "remarkable"})

puts d1.inspect
4

1 に答える 1

1

が呼び出されるたびに、新しいハッシュを作成し、以前のものを空のハッシュword_listに置き換えます。@word_list

def word_list
  @word_list = Hash.new
end

||=代わりに試してみてください。うまくいくHash.new場合にここで使用する理由はありません。{}もちろん、 where は、値がまだ設定されていない場合にのみ値を使用することをa ||= b意味します。a = a || b

def word_list
  @word_list ||= {}
end

@word_listまたは、単語リストのない辞書はまったく辞書ではないため、遅延初期化をまったく行わない方がよいでしょう。代わりに、メソッドで内部ハッシュを作成して、initializeすべてのインスタンスが常にハッシュを持つようにします。

class Dictionary
  def initialize
    @word_list = {}
  end

  def word_list
    @word_list
  end

  # other methods...
end
于 2012-07-23T19:59:27.003 に答える