0

编辑:想通了。这告诉我我的红宝石正在产生一个无限循环。现在,如果我只能弄清楚如何修复循环......

我运行了一个 rake 测试,这就是输出到终端的所有内容:

(in /home/macs/Desktop/projects/odin/odin3_ruby/learn_ruby)

#translate

在我将 ruby​​ 更改为此之前,测试运行良好:

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

我不记得在更改之前我的 ruby​​ 代码是什么。

如果你想看看我的 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
4

1 回答 1

1

You have an array of Strings:

array = x.split("")

but you're comparing those strings with a Regexp:

vowel = /\b[aeiou]*/
#...
until array[0]==vowel do

a == b is false for every String a and Regexp b so you're just writing this in a complicated way:

until false do

Perhaps you mean to say:

until array[0] =~ vowel do

That should stop your infinite loop but your loop still doesn't make much sense. You do this:

it = array[0]
array.push(it)
array.delete(it)

So you grab the first element, push it onto the end of the array, and then delete everything from array that matches it (note that Array#delete deletes all matches). Why not just array.delete(it)? Or, if you only want to toss the first entry, use shift.

于 2013-10-18T00:12:04.183 回答