Ruby:nil的未定义方法'length':NilClass(NoMethodError)

时间:2017-01-14 23:34:59

标签: ruby methods undefined nomethoderror

我正在尝试编写一个接收字符串并输出该字符串中最长字的程序。现在,我知道我的代码看起来很毛茸茸,但我对Ruby语言很陌生,所以请耐心等待。我不明白有关这个问题的任何其他解释。我不是在寻找答案。我想要的只是一个善良的人,请向我解释为什么我的程序在第16行停止,问题标题中说明了这个问题。拜托,谢谢!

# 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"))

2 个答案:

答案 0 :(得分:0)

在while循环中的某个时刻,您将进入idx指向数组中最后一项的状态。那时,要求array[idx+1]返回nil,而NilClass没有方法'length'

简单的修复方法是更改​​while循环条件,以便idx+1始终在数组中。

答案 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