2016-04-03 2 views
0

Я пытаюсь выполнить итерацию через гласные "aeiou" и перемещать каждую букву вперед, возвращая строку "eioua". Это мой код:Ruby iterating through string

def vowel(letter) 
    vowels = "aeiou" 
    string = "" 
    index = 0 
    while index < letter.length 
    current_id = vowels.index(letter) 
    next_vowel = vowels[current_id + 1] 
    string += next_vowel 
    index += 1 
    end 
    string 
end 

Когда я прохожу "aeiou" в качестве параметра моего метода, он просто принимает "a" и печатает "eeeee".

vowel("aeiou") # => "eeeee" 
+0

В чем Ваш вопрос? – sawa

ответ

2

Вы всегда прилагая гласный, найденные по индексу current_id = vowels.index(letter) (увеличиваются на единице.) Вот почему код присоединяет e (Следующие a) в пять раз. index переменная используется только как счетчик циклов.

Существует еще один глюк с этим кодом: когда letter является последним, current_id является индекс последней буквы и vowels[current_id + 1] является nil.

На данный момент я не могу обеспечить решение этой проблемы, потому что описание и ожидаемый результат несовместимы: «перемещение каждой буквы вперед» не будет производить "eioua" на данном входе.

+0

Ах, извините, я не имел в виду одну букву вперед - я имел в виду, что каждая гласная станет следующей гласной справа от нее, так что «a» станет «e», а «u» станет «a». Я также заметил, что гласные [current_id + 1] становятся ноль, но я до сих пор не совсем понимаю, почему вы можете уточнить? Благодарим вас за полезную обратную связь! –

+1

Когда 'current_id' является индексом последней буквы,' current_id + 1' является индексом, большим, чем длина строки, то есть это несуществующий индекс. ''abc' [3]' является, например, 'Nil'. – mudasobwa

1

Если вы хотите, чтобы повернуть буквы слова (и сформировать новое слово, в отличие от изменения слова на месте) один из способов является:

str = "aeiou" 

new_str = str.chars.rotate.join. #=> "eioua" 
str        #=> "aeiou" 

Если вы хотите изменить строку на месте :

str.object_id.      #=> 70128532752540 
str.replace(str.chars.rotate.join) #=> "eioua" 
str        #=> "eioua" 
str.object_id      #=> 70128532752540 
+1

Это гораздо лучший способ сделать это. Ruby имеет все эти короткие методы на основе Enumerator, которые действительно великолепны, когда их можно использовать совместно. – tadman