在这段代码中,如果我通过"我的名字是bobby li"到longest_word
它返回" bobby"。但是,如果我选择else
而不是elsif
,则会返回" li"。谁能解释一下?
def longest_word(sentence)
words = sentence.split(" ")
longest_word = nil
word_idx = 0
while word_idx < words.length
current_word = words[word_idx]
if longest_word == nil
longest_word = current_word
elsif longest_word.length < current_word.length
longest_word = current_word
end
word_idx += 1
end
return longest_word
end
答案 0 :(得分:2)
这不是你问的,但我希望它有用。
让我感到震惊的是你在你的功能中做了很多不必要的工作。以下是一些潜在的替代方案。
def longest_word(sentence)
longest_word = nil
sentence.split(" ").each do |current_word|
longest_word ||= current_word
longest_word = current_word if current_word.length > longest_word.length
end
longest_word
end
在这里,使用sentence.split(" ").each do |current_word|
可以跳过您正在做的所有idx
内容。
现在,在您所说的代码中:
if longest_word == nil
longest_word = current_word
...
end
我建议你使用:
if longest_word.nil?
longest_word = current_word
...
end
或者更好:
unless longest_word
longest_word = current_word
...
end
如果你更进一步,你可以使用尾随条件摆脱你的第一个if
语句:
longest_word = current_word unless longest_word
在ruby(IMO)中说这个的更惯用的方式是:
longest_word ||= current_word
(有关||=
的详细信息的Google'红宝石条件分配')。
之后,你可以说:
if current_word.length > longest_word.length
longest_word = current_word
end
但我认为使用尾随条件更清晰:
longest_word = current_word if current_word.length > longest_word.length
这种方法可以为您节省七行代码 - 这可能看起来不是很多。但是,随着时间的推移它会堆积起来。更重要的是,我认为阅读和理解可能更容易。
而不是以上所有,你可以简单地说:
def longest_word(sentence)
sentence.split(" ")
.sort{|x,y| x.length <=> y.length}
.last
end
这基本上说,“按照长度的升序对单词数组进行排序,然后返回最后一个元素”。
就个人而言,我写的就是:
def longest_word(sentence)
sentence.split(" ").sort{|x,y| x.length <=> y.length}.last
end
你保存了12行(我喜欢这样做,所以我可以在屏幕上看到更多,而不必滚动我的代码)。
没有条件。没有任务。没有循环。只是干净和可读的红宝石善良。
无论如何,我希望有所帮助。
答案 1 :(得分:0)
在第一次迭代期间,longest_word
为零,因此将执行if条件。如果你使用else
,在循环的剩余迭代中,if
条件永远不会评估为真,因为它不再是nil。
因此,无论current_word
的长度是否大于longest_word
,它都只会将current_word
更新为longest_word
。因此,如果longest_word
代替else
,您将始终将elsif
作为最后一个字。
答案 2 :(得分:0)
如果您使用elsif
,则始终检查条件current_word
长度是否大于目前为止找到的longest_word
,并仅更新longest_word
如果条件评估为真,则current_word
确实长于longest_word
。所以答案是“鲍比”。
但如果您使用else
,那么我们只需将longest_word
更新为current_word
,而不管current_word
是否长于longest_word
。所以,ans是单词[last_index],即“li”