2

私のコードは 1 つの単語に対して正常に動作するため、サーチャー Proc は正常に動作します。複数の単語を配列に格納し、各単語をprocに渡してまとめることで、複数の単語に対して機能させようとしていましたが、「パイを食べる」などをテストすると、これが返されます。私が間違っていることを教えてもらえますか?

Failures:

1) translate translates two words
 Failure/Error: s.should == "eatay iepay"
   expected: "eatay iepay"
        got: "eat pieay eat pieayay" (using ==)
 # ./04_pig_latin/pig_latin_spec.rb:41:in `block (2 levels) in <top (required)>'

私のコードは次のとおりです。

def translate(x)
  array = x.split(' ')  
  searcher = Proc.new{ 
    if x.index(/[aeiou]/) == 0
      x = x + "ay"
    elsif x[0..1] == "qu"
      first = x.chr
      x.reverse!.chop!.reverse!
      second = x.chr
      x.reverse!.chop!.reverse!
      x = x + first + second + "ay"
   elsif x.index(/[aeiou]/) == 1
     first = x.chr
     x.reverse!.chop!.reverse!
     x = x + first + "ay"
  elsif x[1..2] == "qu"
     first = x.chr
     x.reverse!.chop!.reverse!
     second = x.chr
     x.reverse!.chop!.reverse!
     third = x.chr
     x.reverse!.chop!.reverse!
     x = x + first + second + third +"ay"
  elsif x.index(/[aeiou]/) == 2
    first = x.chr.chr
    x.reverse!.chop!.reverse!
    second = x.chr
    x.reverse!.chop!.reverse!
    x = x + first + second + "ay"
 elsif x.index(/[aeiou]/) == 3
   first = x.chr
   x.reverse!.chop!.reverse!
   second = x.chr
   x.reverse!.chop!.reverse!
   third = x.chr
   x.reverse!.chop!.reverse!
   x = x + first + second + third +"ay"
else
  x
end
}
if array.count == 1
  searcher.call
  return x
else
  return array.collect(&searcher).join(' ')
end
end
4

1 に答える 1

3

問題は、配列の各要素を一度に 1 つずつ処理することを本当に意図しているときに、に渡された引数で閉じられているxProcで参照していることです。searcherxtranslate

コードの構造をより簡単に推論できるように変更しました。匿名を削除しProc、慣用的な Ruby マップを使用して文字列を処理しました。

#!/usr/bin/env ruby

def translate_word(x)
  if x.index(/[aeiou]/) == 0
    x = x + "ay"
  elsif x[0..1] == "qu"
    first = x.chr
    x.reverse!.chop!.reverse!
    second = x.chr
    x.reverse!.chop!.reverse!
    x = x + first + second + "ay"
  elsif x.index(/[aeiou]/) == 1
    first = x.chr
    x.reverse!.chop!.reverse!
    x = x + first + "ay"
  elsif x[1..2] == "qu"
    first = x.chr
    x.reverse!.chop!.reverse!
    second = x.chr
    x.reverse!.chop!.reverse!
    third = x.chr
    x.reverse!.chop!.reverse!
    x = x + first + second + third +"ay"
  elsif x.index(/[aeiou]/) == 2
    first = x.chr.chr
    x.reverse!.chop!.reverse!
    second = x.chr
    x.reverse!.chop!.reverse!
    x = x + first + second + "ay"
  elsif x.index(/[aeiou]/) == 3
    first = x.chr
    x.reverse!.chop!.reverse!
    second = x.chr
    x.reverse!.chop!.reverse!
    third = x.chr
    x.reverse!.chop!.reverse!
    x = x + first + second + third +"ay"
  else
    x
  end
end

words = ARGV[0].split(' ').map { |word| translate_word(word) }.join(' ')
puts words

それまでに検証chmod +x pig_latin:

./pig_latin "eat pie"
./pig_latin "eat"
于 2013-07-15T16:44:22.777 に答える