2015-02-07 2 views
0

Цель состоит в том, чтобы переместить каждую букву на следующую букву в алфавите, на карте, она успешно изменила букву, но как только я оттуда, значение исчезнет, ​​кроме гласных. Как так?Array.map {| x | change value} удаляет его из массива, почему?

def LetterChanges(str) 
    abc = [*("a".."z")] 

    result = str.split(//) 

    result.map! do |x| 

    if abc.include?(x) 

    if x == "z" 
     x = "A" 
     else 
     x = abc[abc.index(x)+1] 

     # if you puts x here, you can see it changes value correctly 

     if x == "a" || x == "e" || x == "i" || x == "o" || x == "u" 
      x.capitalize! 
      end 
     end 
    end 

    #However here, the changed values that are not vowels disappear 
    # WHY is that happening, is the second if (vowel) affecting it? How? 

end 
puts "#{result.join}" #<--- its only putting the vowels 
return result.join 

end 

LetterChanges("what the hell is going on?") 
+0

Что такое значение вашего блока, когда символ ('x') не в' abc'? Как насчет того, '' '' '' w''? Пройдите через код вручную или в отладчике. Или преобразовать его в лямбда ('f = lambda do | x | if abc.include? (X) ... end'), чтобы вы могли легко оценить блок в' irb' с различными входами. –

+0

спасибо mu - если его не в abc, я хочу такое же значение, поэтому я думал, что он просто сохранит значение (x), если он не будет соответствовать ни одному из условий if. Почему этого не происходит? Что заставляет (x) потерять значение, которое потребовалось при создании? – kortes

ответ

1

блок передается map! должен возвращать значение во всех случаях для этой работы.

http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-map-21

def LetterChanges(str) 
    abc = [*("a".."z")] 

    result = str.split(//) 

    result.map! do |x| 
    if abc.include?(x) 
     if x == "z" 
     x = "A" 
     else 
     x = abc[abc.index(x)+1] 
     if x == "a" || x == "e" || x == "i" || x == "o" || x == "u" 
      x.capitalize! 
      end 
     end 
    end 
    x 
    end 

    result.join 
end 
+0

спасибо Дэниэлу, быстрый вопрос: если он проходит через каждый x, почему он не возвращает x, если он не соответствует критериям для всех if? – kortes

+0

Значение, возвращаемое блоком кода, переданным в 'map!', Является последним выражением, которое оценивается. 'If', который является' false', оценивается как 'nil', поэтому, если выполнение достигает' if x == 'a "|| x == "e" || x == "i" || x == "o" || x == "u" 'с буквой, которая не является гласным, тогда блок будет возвращать' nil' без явного 'x' в конце. – mikej

+1

ahhh ДА !!, о человек, спасибо много mikej! Это прояснилось !!! – kortes

1

Проблема в том, ваше ли. Когда x не является гласным, возвращающим нуль.

Просто измените эту строку

if x == "a" || x == "e" || x == "i" || x == "o" || x == "u" 
    x.capitalize! 
end 

С этим

x = %w{a e i o u}.include?(x) ? x.capitalize : x 
+0

спасибо Дэниэлу, эй, что происходит здесь: «% w {aeiou}», как в, что такое «% w», и как получилось «% w {thesedontneedcommas?}», Я считаю, что это работает, но я хочу понять, что shortcode – kortes

+0

Другой формат для создания массива. с% wi говорят, что элементы разделены пробелами, {} являются пределами, поэтому % {aeiou} == ["a", "e", "i", "o", "u"] –

+0

Могу ли я предложить docs на Ruby-литералах: http://www.ruby-doc.org/core-2.1.1/doc/syntax/literals_rdoc.html – danielrsmith

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

  • Нет связанных вопросов^_^