编辑:想通了。这告诉我,我的红宝石正在产生无限循环。现在,如果我只能弄清楚如何修复循环......
我运行了一个rake测试,这就是输出到终端的所有内容:
(in /home/macs/Desktop/projects/odin/odin3_ruby/learn_ruby)
#translate
在我将红宝石改为此之前,测试工作正常:
def translate(x)
vowel = /\b[aeiou]*/
array = x.split("")
until array[0]==vowel do
it = array[0]
array.push(it)
array.delete(it)
end
new = array.join("")
new+="ay"
end
在我更改之前,我不记得我的红宝石代码究竟是什么。
如果你好奇地看到我的rake文件就是这个。顺便说一句,我从教程网站下载了这个文件,我很肯定我根本没有改变它。
# # Topics
#
# * modules
# * strings
#
# # Pig Latin
#
# Pig Latin is a made-up children's language that's intended to be confusing. It obeys a few simple rules (below) but when it's spoken quickly it's really difficult for non-children (and non-native speakers) to understand.
#
# Rule 1: If a word begins with a vowel sound, add an "ay" sound to the end of the word.
#
# Rule 2: If a word begins with a consonant sound, move it to the end of the word, and then add an "ay" sound to the end of the word.
#
# (There are a few more rules for edge cases, and there are regional variants too, but that should be enough to understand the tests.)
#
# See <http://en.wikipedia.org/wiki/Pig_latin> for more details.
#
#
require "pig_latin"
describe "#translate" do
it "translates a word beginning with a vowel" do
s = translate("apple")
s.should == "appleay"
end
it "translates a word beginning with a consonant" do
s = translate("banana")
s.should == "ananabay"
end
it "translates a word beginning with two consonants" do
s = translate("cherry")
s.should == "errychay"
end
it "translates two words" do
s = translate("eat pie")
s.should == "eatay iepay"
end
it "translates a word beginning with three consonants" do
translate("three").should == "eethray"
end
it "counts 'sch' as a single phoneme" do
s = translate("school")
s.should == "oolschay"
end
it "counts 'qu' as a single phoneme" do
s = translate("quiet")
s.should == "ietquay"
end
it "counts 'qu' as a consonant even when it's preceded by a consonant" do
s = translate("square")
s.should == "aresquay"
end
it "translates many words" do
s = translate("the quick brown fox")
s.should == "ethay ickquay ownbray oxfay"
end
# Test-driving bonus:
# * write a test asserting that capitalized words are still capitalized (but with a different initial capital letter, of course)
# * retain the punctuation from the original phrase
end
答案 0 :(得分:1)
你有一个字符串数组:
array = x.split("")
但是你要将这些字符串与正则表达式进行比较:
vowel = /\b[aeiou]*/
#...
until array[0]==vowel do
对于每个字符串a == b
和正则表达式a
, b
为false,因此您只是以复杂的方式编写它:
until false do
也许你的意思是说:
until array[0] =~ vowel do
这应该会阻止你的无限循环,但你的循环仍然没有多大意义。你这样做:
it = array[0]
array.push(it)
array.delete(it)
所以你抓住第一个元素push
到数组的末尾,然后delete
来自array
的匹配it
的所有内容(注意{{1}删除所有匹配)。为什么不只是Array#delete
?或者,如果您只想丢弃第一个条目,请使用shift
。