Test-First-Ruby 04_pig_latin - получение пустой строки
Я изучаю Ruby с помощью Test-First-Ruby, и у меня возникла проблема с кодом, который я написал для программы для перевода слов на латинский язык. Вместо того, чтобы возвращать переведенное слово, я получаю пустую строку. Здесь по порядку приведен мой код, файл спецификации для его тестирования и код ошибки / ошибки, который я получаю при попытке запустить файл спецификации в терминале (Mac OS 10.12, Ruby 2.5.0)
Вот код:
def translate(string)
array = string.split(" ")
pigged_array = array.map! {|x| pigify(x)}
result = pigged_array.join(" ")
return result
end
def pigify(word)
vowels = ["a", "e", "i", "o", "u"]
if vowels.include? word[0].downcase
puts word + "ay"
# two cases for "qu"
elsif word[0..1] == "qu"
puts word[2..-1] + "quay"
elsif word[1..2] == "qu"
puts word[3..-1] + word[0..2] + "ay"
# for words that start with 3 consonants
elsif !(vowels.include? word[0]) && !(vowels.include? word[1]) && !(vowels.include? word[2])
puts word[3..-1] + word[0..2] + "ay"
# for words that start with 2 consonants
elsif !(vowels.include? word[0]) && !(vowels.include? word[1]) # for 2
puts word[2..-1] + word[0..1] + "ay"
# for words that start with a single consonant
else
puts word[1..-1] + word[0] + "ay"
end
end
и вот файл спецификации:
require "04_pig_latin"
describe "#translate" do
it "translates a word beginning with a vowel" do
s = translate("apple")
expect(s).to eq("appleay")
end
it "translates a word beginning with a consonant" do
s = translate("banana")
expect(s).to eq("ananabay")
end
it "translates a word beginning with two consonants" do
s = translate("cherry")
expect(s).to eq("errychay")
end
it "translates two words" do
s = translate("eat pie")
expect(s).to eq("eatay iepay")
end
it "translates a word beginning with three consonants" do
expect(translate("three")).to eq("eethray")
end
it "counts 'sch' as a single phoneme" do
s = translate("school")
expect(s).to eq("oolschay")
end
it "counts 'qu' as a single phoneme" do
s = translate("quiet")
expect(s).to eq("ietquay")
end
it "counts 'qu' as a consonant even when it's preceded by a consonant" do
s = translate("square")
expect(s).to eq("aresquay")
end
it "translates many words" do
s = translate("the quick brown fox")
expect(s).to eq("ethay ickquay ownbray oxfay")
end
и, наконец, вот сообщение, которое я получаю, когда запускаю файл спецификации в терминале:
#translate
appleay
#translates a word beginning with a vowel (FAILED - 1)
Failures:
1) #translate translates a word beginning with a vowel
Failure/Error: expect(s).to eq("appleay")
expected: "appleay"
got: ""
(compared using ==)
# ./spec/04_pig_latin_spec.rb:29:in `block (2 levels) in <top
(required)>'
Finished in 0.00168 seconds (files took 0.11091 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./spec/04_pig_latin_spec.rb:27 # #translate translates a word beginning with a vowel
1 ответ
Ваш pigify
метод puts
вводить строки в терминал, но не возвращать их вызывающей стороне. puts
метод вернется nil
а ruby возвращает результат последней оцененной строки в методе. В вашем pigify
, в каждом if/elsif/else
ответвление последней оцененной строки puts
, так pigify
возвращается nil
, Затем вы join
все nil
значения вместе и получить длинную строку пробелов (или, в случае строки из одного слова, пустую строку обратно) в качестве значения.
Чтобы это исправить, просто удалите звонки puts
в pigify
и оставить строки:
def pigify(word)
vowels = ["a", "e", "i", "o", "u"]
if vowels.include? word[0].downcase
word + "ay"
# two cases for "qu"
elsif word[0..1] == "qu"
word[2..-1] + "quay"
elsif word[1..2] == "qu"
word[3..-1] + word[0..2] + "ay"
# for words that start with 3 consonants
elsif !(vowels.include? word[0]) && !(vowels.include? word[1]) && !(vowels.include? word[2])
word[3..-1] + word[0..2] + "ay"
# for words that start with 2 consonants
elsif !(vowels.include? word[0]) && !(vowels.include? word[1]) # for 2
word[2..-1] + word[0..1] + "ay"
# for words that start with a single consonant
else
word[1..-1] + word[0] + "ay"
end
end
Теперь последняя строка, оцениваемая в каждой ветви, является изменяемой строкой, поэтому измененная строка будет возвращена из метода.