为什么长度不被视为此代码中的方法?

Chr*_*ris 0 ruby-on-rails

def longest_word(string)
  words = string.split
  idx = 0
  while idx < words.length
    if words[idx].length > words[idx + 1].length
      longest = words[idx]
    else
      longest = words [idx + 1]
    end
    idx += 1
  end
  return longest
end

puts(longest_word("peas rambling tattoo") == "rambling") 
Run Code Online (Sandbox Code Playgroud)

不断收到错误消息

longest_word.rb:5:in longest_word': undefined methodlength'为nil:
来自longest_word.rb的NilClass(NoMethodError):15:in''

关于为什么会发生这种情况的任何信息都会很棒

knu*_*nut 6

words.length 返回元素数,但索引从0开始.

你需要一个 (words.length - 1)

def longest_word(string)
  words = string.split
  idx = 0
  while idx < (words.length - 1)
    if words[idx].length > words[idx + 1].length
      longest = words[idx]
    else
      longest = words [idx + 1]
    end
    idx += 1
  end
  return longest
end

puts(longest_word("peas rambling tattoo") == "rambling") 
Run Code Online (Sandbox Code Playgroud)

你的代码不是'rubyesk',我更喜欢:

def longest_word(string)
  longest = ''
  string.split.each do |word|
    longest = word.length > longest.length ? word : longest
  end
  return longest
end

puts(longest_word("peas rambling tattoo") == "rambling") 
Run Code Online (Sandbox Code Playgroud)

或者更好:

def longest_word(string)
  longest = ''
  string.split.each do |word|
      longest = word  if word.length > longest.length 
  end
  return longest
end

puts(longest_word("peas rambling tattoo") == "rambling") 
Run Code Online (Sandbox Code Playgroud)

您还可以使用max_by更短的代码:

def longest_word(string)
  string.split.max_by{|word| word.length}
end

puts(longest_word("peas rambling tattoo") == "rambling") 
Run Code Online (Sandbox Code Playgroud)

甚至更短 string.split.max_by(&:length)