Ваш код не "зависает";при его запуске возникает это исключение:
NoMethodError (undefined method '<' for nil:NilClass)
в строке:
if converted_words[i][x] < converted_words[i-1][x]
Мы сразу видим проблему, хотя причина еще не известна.Получатель метода <
равен converted_words[i][x]
.Поскольку в сообщении об ошибке говорится, что nil
не имеет метода <
, мы заключаем, что converted_words[i][x]
равно nil
. 1 Это означает, что индекс находится вне допустимого диапазона (примерыиндекс, выходящий за пределы допустимого диапазона: [1,2][412] #=> nil
и [1,2][-3] #=> nil
).Если бы i
было вне диапазона, выражение уменьшилось бы до nil[x] < ...
, что привело бы к исключению, что nil
не имеет метода NilClass#\[\]]
.Это не наше сообщение об исключении, поэтому мы заключаем, что x
должно быть вне диапазона.
Чтобы понять, почему это происходит, предположим:
words = ["a", "ab"]
Затем
converted_words =
words.map(&:chars).map { |letters| letters.map { |letter| letter.to_i 36 } }
#=> [[10], [10, 11]]
i = 1
x = 0
while i < converted_words.length
#=> while 1 < 2 => while true, so enter the loop
if converted_words[i][x] == converted_words[i-1][x]
#=> if converted_words[1][0] == converted_words[0][0] => if 10 == 10 => true
, поэтому выполните
x = x + 1
#=> x = 0 + 1 => 1
и попытайтесь повторить цикл.
while i < converted_words.length
#=> while 1 < 2 => while true, so repeat the loop
if converted_words[i][x] == converted_words[i-1][x]
#=> if converted_words[1][1] == converted_words[0][1] => if 11 == nil => false
, поэтому выполните (else
).
if converted_words[i][x] < converted_words[i-1][x]
#=> converted_words[0][1] < converted_words[-1][1] => if nil < 11
#=> NoMethodError (undefined method '<' for nil:NilClass)
Сообщения об ошибкахсодержать ценную информацию.Внимательно изучите их!
1 Сообщение об ошибке "nil
не имеет метода <
" здесь эквивалентно " NilClass не имеет метода экземпляра <
".