2015-07-29 2 views
1

Я не могу сделать мой код пройти этот тест:Рубин Условного тест

it "translates two words" do 
    s = translate("eat pie") 
    s.should == "eatay iepay" 
    end 

Я не вижу изъян в моей логике, хотя это может быть очень грубой силой и может быть более простым способом прохождение теста:

def translate(string) 
    string_array = string.split 
    string_length = string_array.size 
    i=0 

    while i < string_length 
     word = string_array[i] 
     if word[0] == ("a" || "e" || "i" || "o" || "u") 
      word = word + "ay" 
      string_array[i] = word 

     elsif word[0] != ("a" || "e" || "i" || "o" || "u") && word[1] != ("a" || "e" || "i" || "o" || "u") 
      word_length = word.length-1 
      word = word[2..word_length]+word[0]+word[1]+"ay" 
      string_array[i] = word 

     elsif word[0] != ("a" || "e" || "i" || "o" || "u") 
      word_length = word.length-1 
      word = word[1..word_length]+word[0]+"ay" 
      string_array[i] = word 
     end 

     i += 1 
    end 
    return string_array.join(" ") 
end 

Вот сообщение Неудачный тест:

неудачи:

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

Дополнительный код, проверяющий другие условия, относится к другим тестам, которые я уже прошел. В принципе, теперь я проверяю строку с двумя словами.

Пожалуйста, дайте мне знать, как я могу заставить код пройти тест. Заранее спасибо!

ответ

5

"a" || "e" || "i" || "o" || "u" оценивается в "a", потому что "a" - значение истины. (Не nil, а не false):

irb(main):001:0> ("a" || "e" || "i" || "o" || "u") 
=> "a" 
irb(main):002:0> "a" == ("a" || "e" || "i" || "o" || "u") 
=> true 
irb(main):003:0> "e" == ("a" || "e" || "i" || "o" || "u") 
=> false 

Как об использовании Array#include? вместо:

irb(main):001:0> %w{a e i o u}.include? "a" 
=> true 
irb(main):002:0> %w{a e i o u}.include? "e" 
=> true 

или с помощью =~ (регулярного выражения):

irb(main):007:0> "e" =~ /[aeiou]/ 
=> 0 
+3

'% {AEIOU} 'должно быть'% w {aeiou} ', не так ли? '% {}' является неясным способом создания строки (включая все пробельные символы, в отличие от '% w()'). – cremno

+1

@cremno, спасибо, что указал. Я исправил код соответствующим образом. – falsetru

Смежные вопросы