1

ある単語を別の文字列と比較しています。別の文字列は、アルファベットをループして、単語のすべての位置に各文字を挿入することで変化しています。

@position_counter = 0

編集:letter_loopが実行しているコードは次のとおりです。

@array = ["amethod", "variable", "block"]

def word_list_loop
  @match_counter = 0
  @array.each do |word|
    letter_loop(word)
  end
  puts @match_counter
end

編集を閉じる

def letter_loop(word)
  ("a".."z").each do |letter|
     word_plus_letter = @word.dup
     word_plus_letter.insert(@position_counter, letter)
     @match_counter+=1 if word.match(/\A#{word_plus_letter}\z/)
  end
  @position_counter+=1
  letter_loop(word) unless @position_counter == (@word.length + 1) 
end

私が引数に使用している単語はです"method"。しかし、これを実行すると、が取得されindex 7 out of string (IndexError)ます。各位置のアルファベットを正しくループしますが、unless @position_counter == (@word.length + 1)最後まで引っ掛かっていないようです。

ifステートメントなどを使用して他のいくつかの方法を試しましたが、メソッドを完全に完了することができません。

4

2 に答える 2

1

何回走っていletter_loopますか?最初の実行でエラーが発生しますか? 私が見たところ、ゼロにリセットせずにもう一度呼び出すと、表示されている正確なエラーが発生する@position_counterことから始まります。@word.length + 1それ以外には、コードに問題は見つかりませんでした (ここでは最初の実行で問題なく実行されました)。

更新:再帰的なソリューションを使用しておりposition_counter、プログラムの状態 (メソッド呼び出しの状態のみ) を表していないため、宣言するのではなく@position_counter、メソッドのオプションのパラメーターとして宣言することをお勧めします。

def letter_loop(word, position_counter=0)
  ("a".."z").each do |letter|
     word_plus_letter = @word.dup
     word_plus_letter.insert(position_counter, letter)
     @match_counter+=1 if word.match(/\A#{word_plus_letter}\z/)
  end
  position_counter+=1
  letter_loop(word, position_counter) unless position_counter == (@word.length + 1) 
end

これを行うことができない/したくない場合は、前に提案したように、使用する前/後にリセットするだけで問題なく動作します:

@array.each do |word|
  @position_counter = 0
  letter_loop(word)
end

(ただし、この2番目のアプローチはお勧めしません。別の場所でリセットするのを忘れると、メソッドが再び失敗するためです)

于 2012-09-15T03:49:58.657 に答える
0

letter_loop問題は、内から呼び出していることだと思いますが、ループの各反復でゼロに@array.eachリセットしません。@position_counter@array.each

それでも問題が解決しない場合は、の最初の行として次のようなものを追加しますletter_loop

puts "letter_loop word=#{word}, position=#{@position_counter}, matches=#{@match_counter}"

次に、プログラムを実行し、 に至るまでの出力を調べますIndexError

于 2012-09-15T07:06:34.063 に答える