Переверните строку в Ruby, читая задом наперед - PullRequest
0 голосов
/ 12 декабря 2018

Я просто тренируюсь и учусь, пока выполняются циклы и условные выражения (еще не в массивах).Я пытаюсь перевернуть любую строку путем объединения букв, начиная с последней буквы слова до первой.например, для cat, начните с t, затем a, затем c, чтобы получить tac.

Я не понимаю, что не так в коде.Мне интересно, почему 6-я строка (обратная + = буква) выдает сообщение об ошибке:

6: в `+ ': нет неявного преобразования nil в String (TypeError)

Что ноль?

def is_reversed(word)
  i = word.length
  reverse = ""
  while i > word.length || i != -1
    letter = word[i]
    reverse += letter
    i = i - 1
  end
  return reverse
end

puts is_reversed("cat") 

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Здесь есть несколько проблем, но суть в том, что вы ошибаетесь.Вы можете считать до числа или вниз от числа, и похоже, что вы хотите отсчитать, начиная с word.length.Это нормально, но давайте посмотрим и посмотрим, что вы на самом деле делаете.

С while i > word.length || i != -1 вы проверяете каждую итерацию, что i ... больше, чем длина слова?Как бы это получилось (вы никуда не добавляете i) и почему вы хотите это проверить?

Поскольку вы выбрали обратный отсчет, мы хотим остановиться, когда букв не осталось,Поэтому измените ваше состояние на while i > 0.Теперь мы будем зацикливаться только тогда, когда осталось пройти через буквы.

Однако есть еще одна проблема - потому что индексы начинаются с 0, пытаясь получить word[i], когда i == 3 даст вам nil!Таким образом, вы действительно хотите переместить i = i - 1 на первую строку в вашем цикле.

После этих изменений вы должны иметь:

def is_reversed(word)
  i = word.length
  reverse = ""
  while i > 0
    i = i - 1
    letter = word[i]
    reverse += letter
  end
  return reverse
end

puts is_reversed("cat") 
0 голосов
/ 12 декабря 2018

Я понимаю, что на этот вопрос уже получен ответ, но как насчет чего-то вроде:

def is_reversed(w)
  w.split("").each_with_object("").with_index{ |(l,a), i| a << w[(w.length-1-i)] }
end

В консоли:

is_reversed('this is reversed')
=> "desrever si siht"
is_reversed('and so is this')
=> "siht si os dna"
is_reversed('antidisestablishmentarianism')
=> "msinairatnemhsilbatsesiditna"

Примечания:

  • 105символы вместо 152
  • 3 строки вместо 10
  • Использует << вместо += (что на быстрее )
  • Предотвращает while i > 0 бит, который, IMO, не очень идиоматичный Ruby
  • Предотвращает ненужные присвоения переменных (i = word.length, reverse = "", i = i - 1 и letter = word[i])
0 голосов
/ 12 декабря 2018
def is_reversed(word)
  i = word.length
  reverse = ""
  while i > word.length || i != -1
    i = i - 1
    letter = word[i]
    reverse += letter
  end
  return reverse
end

puts is_reversed("cat") 
// will return 'tact'

В первый раз в приведенном выше цикле вы пытаетесь найти букву, в которую вы помещаете индекс как word.length, который на самом деле не существует и, следовательно, возвращает nil, что вызвало ошибку.Чтобы получить последнюю букву строки, вам нужно будет сделать i = i - 1, прежде чем делать что-либо еще внутри цикла.

Во-вторых, я думаю, что ваше состояние неверно.Если вы попытаетесь найти элемент в -1 в массиве или строке в ruby, это даст вам последний элемент.И первое условие i > word.length никогда не будет удовлетворено, так как значение i равно word.length.

Так что вы можете сделать что-то вроде этого

def is_reversed(word)
  i = word.length
  reverse = ""
  while i > 0
    i = i - 1
    letter = word[i]
    reverse += letter
  end
  return reverse
end

puts is_reversed("cat") 

//returns 'tac'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...