2017-01-14 8 views
1

Я пытаюсь написать программу, которая берет строку и выводит самое длинное слово в этой строке. Теперь я знаю, что мой код выглядит довольно волосатым, но я довольно новичок в языке Ruby, поэтому, пожалуйста, просто несите меня. Я не понимаю каких-либо других объяснений, касающихся этой проблемы. Я не ищу ответа. Все, что я хочу, - это доброжелательный человек, чтобы объяснить мне, почему моя программа останавливается в строке 16 с проблемой, указанной в названии этого вопроса. Пожалуйста и спасибо!Ruby: Undefined method 'length' for nil: NilClass (NoMethodError)

# longest_word.rb 
# A method that takes in a string and returns the longest word 
# in the string. Assume that the string contains only 
# letters and spaces. I have used the String 'split' method to 
# aid me in my quest. Difficulty: easy. 

def longest_word(sentence) 
    array = sentence.split(" ") 

    idx = 0 
    ordered_array = [] 

    puts(array.length) 

    while idx <= array.length 
    if (array[idx].length) < (array[idx + 1].length) 
     short_word = array[idx] 
     ordered_array.push(short_word) 
     idx += 1 
    elsif array[idx].length > array[idx + 1].length 
     long_word = array[idx] 
     ordered_array.unshift(long_word) 
     idx += 1 
    else l_w = ordered_array[0] 
     return l_w 
    end 
    end 
end 

puts("\nTests for #longest_word") 
puts(longest_word("hi hello goodbye")) 
+1

Пожалуйста, включите минимальный пример кода в теле сообщения. Изображения не очень помогают, поскольку мы не можем копировать их в наши собственные среды и запускать их. –

+2

Когда вы отправляете изображение своего кода, вместо того, чтобы публиковать свой код, вы заставляете людей вводить все это, чтобы помочь вам. Вы действительно думаете, что это хорошее отношение? –

+1

... и ссылки должны быть разбиты. Отправьте код здесь, и он будет жить вечно. Эти предложения помогут вам изменить свой вопрос и заменить ссылку на свой код. –

ответ

0

В какой-то момент вашего цикла while вы попадаете в состояние, когда idx указывает на последний элемент массива. В этот момент запрос array[idx+1] возвращает нуль, а у NilClass нет метода 'length'

Простым решением было бы изменить условие цикла while так, чтобы idx+1 всегда находилось внутри массива.

0

Могу я рекомендовать более короткое решение.

words1= "This is a sentence." # The sentence 

words2 = words1.split(/\W+/) # splits the words by via the space character 

words3 = words2.sort_by {|x| x.length} #sort the array 

words3[-1] #gets the last word 

или

def longest_word(sentence) 
sentence.split(/\W+/).sort_by {|x| x.length}[-1] 
end 

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

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